가장 유용한 속성 [닫기]


784

속성이 매우 유용하다는 것을 알고 있습니다. [Browsable(false)]속성 탭에서 속성을 숨길 수있는 것과 같은 미리 정의 된 것들이 있습니다 . 다음은 특성을 설명하는 좋은 질문 입니다. .NET의 특성은 무엇입니까?

프로젝트에서 실제로 사용하는 사전 정의 된 속성 (및 네임 스페이스)은 무엇입니까?


27
무슨 질문? , 전체 페이지에 멋진 설명과 함께 아름다운 답변이 넘쳐납니다. 이 글을 읽는 동안 많은 전문가들과 인터뷰를하는 것과 같은 경험을 얻었습니다. 질문에 +100
Muthu Ganapathy 나단

동의합니다. 이와 같은 질문은 가장 귀중한 질문 중 하나이므로 닫히는 데 덜 유용합니다.
David Thielen

답변:


669

[DebuggerDisplay]디버깅하는 동안 Type의 인스턴스 위로 마우스를 가져 가면 Type의 사용자 정의 된 출력을 빠르게 볼 수 있습니다. 예:

[DebuggerDisplay("FirstName={FirstName}, LastName={LastName}")]
class Customer
{
    public string FirstName;
    public string LastName;
}

이것이 디버거에서 어떻게 보이는지입니다.

대체 텍스트

또한 속성이 설정된 [WebMethod]속성 CacheDuration은 웹 서비스 메서드의 불필요한 실행을 피할 수 있습니다.


62
와, 정말 알아요. 일반적으로 ToString을 재정 의하여 동일한 작업을 수행했지만 더 좋습니다.
Brian

17
이것에주의하십시오. ToString보다 CPU에서 훨씬 더 큰 덩어리를 물었습니다.
Nikola Radosavljević

1
이것을 사용하여 메소드의 결과를 표시 할 수도 있습니다. 이로 인해 메소드 (또는 특성 가져 오기)에 부작용이있는 경우 상당히 혼란스러운 디버깅 환경을 만들 수 있습니다.
Øyvind Skaar

4
NikolaRadosavljević @ 만 디버깅하는 동안 CPU 파워를 차지할
Nickolay Kondratyev

2
@Nickolay Kondratyev : 모든 기능을 알지 못하지만 다음과 같은 웹 서비스 모범 사례를 살펴보면 몇 가지 결론을 얻을 수 있습니다. blogs.msdn.com/b/jaredpar/archive/2011/03/ 18 /…
Nikola Radosavljević

273

System.Obsolete내 의견으로는 프레임 워크에서 가장 유용한 속성 중 하나입니다. 더 이상 사용해서는 안되는 코드에 대한 경고를 발생시키는 기능은 매우 유용합니다. 나는 개발자에게 무언가를 더 이상 사용해서는 안된다고 말하고, 왜 더 좋은 / 새로운 것을하는 방법을 설명 할 수있는 방법을 갖는 것을 좋아합니다.

Conditional attribute디버그 용도로도 매우 편리합니다. 릴리스 할 솔루션을 빌드 할 때 컴파일되지 않는 디버그 목적으로 코드에 메소드를 추가 할 수 있습니다.

그런 다음 유용하다고 생각되는 웹 컨트롤과 관련된 많은 속성이 있지만 더 구체적이며 내가 찾은 서버 컨트롤 개발 이외의 용도는 없습니다.


50
System.Obsolete에 매개 변수 중 하나로 "true"를 전달하면 경고가 오류가되어 빌드가 중단됩니다. 모든 경고를 정리 한 후에는이 작업을 수행해야합니다. :)
Adrian Clark

14
모든 경고를 정리 한 후 메소드를 삭제하는 것이 낫지 않습니까?
Pedro

10
@Pedro : 때때로 이전 버전과의 호환성을 위해 사용할 수 없습니다. 비공개이고 사용하지 않는 경우 삭제하십시오.
Fantius

3
@plinth 예외를 던지는 것은 여러 가지 이유로 나쁜 생각입니다. # 1 Obsolete ()를 사용하는 주된 이유는 전환 단계에서 컴파일 된 코드를 계속 작동시킬 수 있기 때문입니다. 누군가가 메소드를 호출하도록 허용하지 않는 경우 왜 메소드를 삭제하지 않습니까?
Dan Herbert

17
@plinth 새로운 코드가 메소드를 사용 하지 못하게 합니다. 오래된 코드는 메소드가 더 이상 사용되지 않는 것으로 표시되면 이진 호환 상태를 유지하지만 예외가 발생하면 작동이 중지됩니다. 누군가가 "Obsolte"플래그를 해결하기 위해 반사를 사용하는 경우, 당신은 ... 더 나쁜 문제가
댄 허버트

204

[Flags]꽤 편리합니다. 구문 설탕은 확실하지만 여전히 좋습니다.

[Flags] 
enum SandwichStuff
{
   Cheese = 1,
   Pickles = 2,
   Chips = 4,
   Ham = 8,
   Eggs = 16,
   PeanutButter = 32,
   Jam = 64
};

public Sandwich MakeSandwich(SandwichStuff stuff)
{
   Console.WriteLine(stuff.ToString());
   // ...
}

// ...

MakeSandwich(SandwichStuff.Cheese 
   | SandwichStuff.Ham 
   | SandwichStuff.PeanutButter);
// produces console output: "Cheese, Ham, PeanutButter"

Leppie 는 내가 깨닫지 못했고이 속성에 대한 열정을 약화시키는 것을 지적합니다. 비트 변수를 열거 변수에 유효한 값으로 허용하도록 컴파일러에 지시 하지 않으며 컴파일러는 열거에 관계없이 이것을 허용합니다. 내 C ++ 배경을 통해 보여줍니다 ... 한숨


그렇다면 Flags 속성은 정확히 무엇입니까?
Andrei Rînea

13
Flags 속성이 모든 것을 처리한다는 것을 깨달았기를 바랍니다. TypeConverter를 제외하고는 전혀 필요하지 않습니다.
leppie

3
@leppie : ToString ()도. 하지만 ... 와우 어떤 이유로 든 속성이없는 열거 형의 동작이 C ++과 동일하다고 기대했습니다. 지금은 그렇지 않습니다. 약한 ... 좋아, .NET 열거 형은 빨라.
Shog9

2
[Flags]는 디버거와 .ToString () 함수가 값이 열거 형의 여러 선언의 조합 일 수 있음을 알도록 도와줍니다. 확실하지 않습니다. Intellisense를 사용하면 열거 형을보다 효과적으로 사용할 수 있습니다.
Kenzi

31
[Flags]구문 설탕보다 더 많이 사용됩니다. 웹 서비스를 사용하는 동안 같은 값 SandwichStuff.Cheese | SandwichStuff.Ham | SandwichStuff.Jam이 전달 되면 직렬화 / 역 직렬화가 작동하지 않습니다 . [Flags]속성이 없으면 deserializer는 값이 플래그의 조합 일 수 있음을 알 수 없습니다. WCF가 작동하지 않는 이유를 생각하는 데 약 이틀을 소비 한 후 어려운 방법을 배웠습니다.
Anchit

177

[DebuggerStepThrough]System.Diagnostics에서 좋아 합니다.

자동 속성없이 초기 .Net에서 작업 해야하는 경우 한 줄 할 일이없는 방법이나 속성으로 들어가는 것을 피하는 데 매우 편리합니다. 속성을 짧은 메서드 나 속성의 getter 또는 setter에 넣으면 디버거에서 "step into"를 눌렀을 때도 바로 비행 할 수 있습니다.


5
그래서 내가 몇 번 내가이 부동산에 관한 것은 알고 싶어
wusher

1
폐쇄로 인해 망가진 부끄러운 일 입니다. 자세한 내용은 gregbeech.com/blogs/tech/archive/2008/10/17/… 을 참조하십시오.
Greg Beech

3
당신이 알고있는 WM_Paint Code에도 유용합니다 :)
Pondidum

@GregBeech 해당 URL은 .NET 오류를 반환합니다. 고급! :)
smdrager 2016 년

@ smdrager-일시적인 문제 였을 것입니다. 오늘 저에게 도움이 될 것 같습니다.
Greg Beech

135

가치있는 것을 위해, 여기 에 모든 .NET 속성의 목록이 있습니다. 수백이 있습니다.

나는 다른 사람에 대해 모르지만 할 수있는 심각한 RTFM이 있습니다!


33
게시 된 목록은 .net 1.1 용이며 여기에 3.5 msdn.microsoft.com/en-us/library/system.attribute.aspx 용 목록 이 있습니다 (작은 아래로 스크롤해야 함)
kay.one 2016 년

2
질문의 링크를 업데이트했습니다. 지금은 3.5에 대한 전체 목록
R. 마르틴 페르난데스는

8
실제로 그것은 구체적으로 3.5가 아닌 최신으로 연결됩니다.
Brian Ortiz

1
이제 목록 만 링크 목록이 아니라 이름과 설명 인 경우. 오 잘 @BrianOrtiz가 맞습니다. 목록은 버전 4.5입니다.
빛나는

상단에 "기타 버전"이라고 표시된 프레임 워크를 변경하기 만하면됩니다.
Novaterata

129

내 투표는 Conditional

[Conditional("DEBUG")]
public void DebugOnlyFunction()
{
    // your code here
}

이를 사용하여 고급 디버깅 기능이있는 기능을 추가 할 수 있습니다. 처럼 Debug.Write디버그 빌드에서만 호출되므로 프로그램의 주요 흐름 외부에서 복잡한 디버그 논리를 캡슐화 할 수 있습니다.


5
#if DEBUG를 수행하는 것과 동일하지 않습니까?
Neil N

10
다소 #if DEBUG는 발신자가 전화를 걸지 않아야한다는 것을 의미하지만 Conditioinal은 전화를 떠나지 만 JIT에서 제거되는 NOP가됩니다.
Rangoric

23
또한 일반적으로 #if DEBUG around calls 및 [Conditional] around methods를 사용 합니다. 따라서 디버깅 방법을 100 번 호출하면 끄는 것은 100이 아닌 단일 코드 변경 문제입니다.
Steve Cooper

13
Rangoric의 의견이 미묘하게 잘못되었습니다 (적어도 C #의 경우).이 방법은 수정되지 않은 채로 포함됩니다. 호출 사이트 자체는 생략됩니다. 이는 몇 가지 영향을 미칩니다. 매개 변수는 평가되지 않으며 조건부 메소드는 수정되지 않은 채 컴파일러의 출력에 포함됩니다. 이를 반영하여 확인할 수 있습니다. msdn.microsoft.com/ko-kr/library/aa664622.aspx blogs.msdn.com/b/jmstall/archive/2007/10/15/…
Mark Sowul

97

난 항상을 사용 DisplayName, Description그리고 DefaultValue내 사용자 컨트롤, 사용자 지정 컨트롤이나 내가 속성 그리드를 통해 편집 할 수 있습니다 모든 클래스의 공용 속성을 통해 속성. 이 태그는 .NET PropertyGrid에서 이름, 설명 패널 및 기본값으로 설정되지 않은 굵은 체 값의 형식을 지정하는 데 사용됩니다.

[DisplayName("Error color")]
[Description("The color used on nodes containing errors.")]
[DefaultValue(Color.Red)]
public Color ErrorColor
{
    ...
} 

DescriptionXML 주석이 없으면 Visual Studio의 IntelliSense가 속성을 고려하기를 바랍니다. 같은 문장을 두 번 반복하지 않아도됩니다.


3
아무도 지적하지 생각 질수 Description.. 열거와 함께 사용할 때 나를 위해 .. 당신까지 그것의 가장 유용한을
nawfal

68

[Serializable]xml 또는 원격 서버와 같은 외부 데이터 소스와 객체를 직렬화 및 역 직렬화하는 데 항상 사용됩니다. 자세한 내용은 여기를 참조하십시오.


C #이 [직렬화] 아닌 사용자 정의 속성 인스턴스 메타 데이터 플래그를 방출 같이 실제로하는 psuedoattribute 불리는 것)
TraumaPony

1
매우 유용한 반면 [직렬화 가능]은 완벽하지 않습니다. 원하는 결과를 얻으려면 너무 많은 땜질과 시행 착오가 필요합니다.
shoosh

나는 그 shoosh를 두 번째로 할 것이다!
John Bubriski

System.NonSerializedAttribute는 자동 직렬화를 더 많이 제어하려는 경우에 유용합니다.
CSharper

참고로 내장 .Net 직렬화의 성능은 수공예 코드보다 2 ~ 3 배 느린 속도와 같이 상당히 열악합니다.
redcalx

57

Hofstadtian 정신에서 [Attribute]속성은 사용자가 자신의 속성을 만드는 방식이므로 매우 유용합니다. 플러그인 시스템을 구현하고 Enum에 설명을 추가하고 여러 디스패치 및 기타 트릭을 시뮬레이션하기 위해 인터페이스 대신 속성을 사용했습니다.


13
멋진데! 플러그인 시스템의 예와 열거 형 설명을 보여 주시겠습니까? 그것들은 내가 구현하는데 관심이있는 것들입니다!
John Bubriski

46

여기에 흥미로운 속성에 대한 게시물입니다 InternalsVisibleTo는 . 기본적으로 C ++ 친구 액세스 기능을 모방합니다. 단위 테스트에 매우 편리합니다.


7
테스트 할 수 없거나 테스트 할 수없는 것에 대한 단위 테스트를 해킹하는 데 편리하지 않습니까?
the_drow

@the_drow : '개인 접근 자'에 대해 이야기 : msdn.microsoft.com/en-us/library/ms184807%28v=vs.80%29.aspx
habakuk

@habakuk : 실제로는 아닙니다. 일반적으로 설계가 잘못되어 단위 테스트를 위해 내부 클래스를 노출해야하는 경우가 있습니다.
the_drow

2
@ the_drow : InternalsVisibleTo가 단위 테스트에 악하다고 말하는 것은 아닙니다. 프로젝트 외부에 보이지 않는 작은 "단위"를 만들고 테스트 할 수 있습니다 (깨끗하고 작은 API를 만드는 데 도움이 됨). 그러나 무언가를 단위 테스트하기 위해 '개인 접근 자'가 필요하다면 아마도 뭔가 잘못되었을 것입니다.
habakuk

10
@the_drow 나는 당신의 주장에 동의하지 않습니다. internal 공개되지 않은 않습니다. 테스트중인 어셈블리 내에서 공개되며 어셈블리 내의 다른 클래스가 수정 기능을 수행 할 수 있도록 단위 테스트를 받아야합니다. 단위 테스트를하지 않으면 모든 소비 클래스에서 해당 기능을 테스트해야합니다.
tvanfosson


28

nUnit 라이브러리 에서 제안 [TestFixture]하고 싶습니다 .[Test]

코드의 단위 테스트는 리팩토링 및 체계화 된 문서화에서 안전을 제공합니다.


26
[XmlIgnore]

이를 통해 (XML 직렬화에서) 저장할 때 예외를 발생시키는 '부모'개체를 무시할 수 있습니다.


25

이름이없고 프레임 워크에서 잘 지원되지 않으며 매개 변수가 필요하지 않지만이 속성은 불변 클래스에 유용한 마커입니다.

[ImmutableObject(true)]

6
문서에 따르면 디자인 타임에만 (불행히도) 사용되었습니다.
Hans Ke st ing

1
이것이 디자인 타임 일 뿐이라면 아마도 자신 만의 ImmutableObjectAttribute클래스 를 만드는 것이 더 좋을 것 입니다. 최소한 매개 변수를 제거 할 수 있습니다.
Roy Tinker

25

[ThreadStatic]스레드 및 스택 기반 프로그래밍과 함께 속성을 사용하는 것이 좋습니다. 예를 들어, 나머지 호출 시퀀스와 공유하고 싶은 값을 원하지만 대역 외 (예 : 호출 매개 변수 외부)에서 수행하려는 경우 다음과 같이 사용할 수 있습니다.

class MyContextInformation : IDisposable {
    [ThreadStatic] private static MyContextInformation current;

    public static MyContextInformation Current {
        get { return current; }
    }

    private MyContextInformation previous;


    public MyContextInformation(Object myData) {
       this.myData = myData;
       previous = current;
       current = this;
    }

    public void Dispose() {
       current = previous;
    }
}

나중에 코드에서이 정보를 사용하여 코드 외부의 사람들에게 상황에 맞는 정보를 제공 할 수 있습니다. 예:

using(new MyContextInformation(someInfoInContext)) {
   ...
}

ThreadStatic 속성을 사용하면 스레드 간 데이터 액세스의 지저분한 문제를 피하면서 해당 스레드로만 호출 범위를 지정할 수 있습니다.


그리고 어떻게 액세스합니까? 여기에서 사용 샘플의 요점을 이해하지 마십시오. 설명 할 수 있습니까?
Beachwalker

@Beachwalker Current는 정적이어야하며 지금 편집해야합니다. 이제 MyContextInformation.Current스택에서 활성 컨텍스트를 얻기 위해 액세스 할 수 있습니다 . 이것은 어떤 경우에는 매우 좋은 개념이며, (내 회사) 엔진은 많은 용도로 사용합니다.
펠릭스 케이

23

DebuggerHiddenAttribute 디버깅 안 코드를 한 단계를 방지 할 수 있습니다.

public static class CustomDebug
{
    [DebuggerHidden]
    public static void Assert(Boolean condition, Func<Exception> exceptionCreator) { ... }
}

...

// The following assert fails, and because of the attribute the exception is shown at this line
// Isn't affecting the stack trace
CustomDebug.Assert(false, () => new Exception()); 

또한 스택 추적에 메소드를 표시하지 못하게하여 다른 메소드를 래핑하는 메소드가있을 때 유용합니다.

[DebuggerHidden]
public Element GetElementAt(Vector2 position)
{
    return GetElementAt(position.X, position.Y);
}

public Element GetElementAt(Single x, Single y) { ... }

지금 전화하면 GetElementAt(new Vector2(10, 10)) 하고 랩된 메소드에서 오류가 발생하면 호출 스택에 오류를 발생시키는 메소드를 호출하는 메소드가 표시되지 않습니다.


21

DesignerSerializationVisibilityAttribute매우 유용합니다. 런타임 속성을 컨트롤 또는 구성 요소에 배치 할 때 디자이너가이를 직렬화하지 않으려면 다음과 같이 사용하십시오.

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Foo Bar {
    get { return baz; }
    set { baz = value; }
}

4
WinForms 구성 요소에 매우 유용합니다. [Browsable (false)]
Mark Heath

3
좋은 점- [Browsable(false)]디자이너의 사용자로부터 숨길 필요가 있으며, [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]필요한 경우 직렬화되지 않습니다.
구성자

17

몇 가지 속성 만 컴파일러를 지원하지만 AOP에서는 매우 흥미로운 속성 사용이 있습니다 . PostSharp 는 맞춤형 속성을 사용하여 IL을 메소드에 주입하여 모든 방식의 기능을 허용합니다. 자동 INotifyPropertyChanged 구현 ( here ) 과 같은 것들 입니다.

컴파일러 또는 런타임에 직접 발생하고 영향을 미치는 일부 :

  • [Conditional("FOO")] -이 메소드에 대한 호출 (인수 평가 포함)은 빌드 중에 "FOO"기호가 정의 된 경우에만 발생합니다.
  • [MethodImpl(...)] -동기화, 인라인과 같은 몇 가지를 나타내는 데 사용
  • [PrincipalPermission(...)] -코드에 보안 검사를 자동으로 주입하는 데 사용
  • [TypeForwardedTo(...)]- 호출자를 다시 작성하지 않고 어셈블리간에 유형을 이동하는 데 사용

리플렉션을 통해 수동으로 확인되는 것들에 대해-나는 System.ComponentModel속성 의 큰 팬입니다 . 것들처럼 [TypeDescriptionProvider(...)], [TypeConverter(...)][Editor(...)]어떤 데이터가 완전히 결합 시나리오 (즉, 동적 특성 등)의 형태의 동작을 변경할 수있다.


15

코드 커버리지 크롤링을 수행하려면이 두 가지가 최상위라고 생각합니다.

 [Serializable]
 [WebMethod]

15
[WebMethod]는 웹 서비스에 노출되는 메소드를 장식하는 데 사용됩니다. [Serializable]은 개체를 앱 도메인에 전달하는 등의 목적으로 직렬화 할 수 있도록 개체를 표시합니다.
Kev

15

나는 [DataObjectMethod]최근 에 사용하고 있습니다. 클래스를 ObjectDataSource (또는 다른 컨트롤)와 함께 사용할 수 있도록 메소드를 설명합니다.

[DataObjectMethod(DataObjectMethodType.Select)] 
[DataObjectMethod(DataObjectMethodType.Delete)] 
[DataObjectMethod(DataObjectMethodType.Update)] 
[DataObjectMethod(DataObjectMethodType.Insert)] 

더 많은 정보


12

현재 프로젝트에서는

[ComVisible(false)]

개별 관리되는 유형이나 멤버 또는 어셈블리 내 모든 유형의 COM에 대한 액세스 가능성을 제어합니다.

더 많은 정보


12
[TypeConverter(typeof(ExpandableObjectConverter))]

디자이너에게 클래스의 속성 인 컨트롤을 확장하도록 지시합니다.

[Obfuscation]

난독 화 도구에 어셈블리, 유형 또는 멤버에 대해 지정된 작업을 수행하도록 지시합니다. (일반적으로 어셈블리 수준을 사용하지만[assembly:ObfuscateAssemblyAttribute(true)]


1
나는 추측했지만 틀렸다. 난독 화 속성은 타사 난 독자에 대한 힌트 일뿐입니다. 컴파일러가 기본적으로 아무것도 모호하게하지 않습니다.
Dan 님이 Firelight 님을보고 계십니다

Visual Studio Pro / Ultimate 사용자에게는 @DanNeely가 무료입니다!
Chris S

4
DotFuscator Community Edition을 언급하는 경우 제공되는 보호 수준이 너무 낮아서 거의 아무것도 계산하지 않습니다.
Dan은 불을 피우고있다

@ricovox 요약을 추가했습니다
Chris S

9

내가 가장 많이 사용하는 속성은 XML 직렬화와 관련된 속성입니다.

XmlRoot

XmlElement

XmlAttribute

기타...

빠르고 더러운 XML 구문 분석 또는 직렬화를 수행 할 때 매우 유용합니다.


8

내가 좋아하는 중간 계층 개발자

System.ComponentModel.EditorBrowsableAttribute UI 개발자가 볼 필요가없는 속성에 압도되지 않도록 속성을 숨길 수 있습니다.

System.ComponentModel.BindableAttribute일부는 데이터 바인딩 될 필요가 없습니다. 다시 한 번, UI 개발자가해야 할 작업이 줄어 듭니다.

DefaultValue로렌스 존스턴이 언급 한 것도 좋아합니다 .

System.ComponentModel.BrowsableAttribute그리고 Flags정기적으로 사용됩니다.

System.STAThreadAttribute System.ThreadStaticAttribute 필요할 때 사용 합니다.

그건 그렇고 나는 이것들이 모든 .Net 프레임 워크 개발자에게 가치가 있습니다.


8

[EditorBrowsable(EditorBrowsableState.Never)]프로젝트가 솔루션에없는 경우 IntelliSense에서 속성 및 메서드를 숨길 수 있습니다. 유창한 인터페이스의 잘못된 흐름을 숨기는 데 매우 유용합니다. GetHashCode () 또는 Equals ()를 얼마나 자주 원하십니까?

MVC의 [ActionName("Name")]경우 동일한 메소드 서명을 가진 Get 조치 및 Post 조치를 갖거나 조치 이름에 대시를 사용할 수 있습니다. 그렇지 않으면 경로를 작성하지 않고는 불가능합니다.


8

다음 속성도 매우 중요하다는 점을 언급하는 것이 중요합니다.

STAThreadAttribute 

응용 프로그램의 COM 스레딩 모델이 단일 스레드 아파트 (STA)임을 나타냅니다.

예를 들어이 특성은 Windows Forms 응용 프로그램에서 사용됩니다.

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

그리고 또한 ...

SuppressMessageAttribute

특정 정적 분석 도구 규칙 위반의보고를 억제하여 단일 코드 아티팩트에 대한 다중 억제를 허용합니다.

예를 들면 다음과 같습니다.

[SuppressMessage("Microsoft.Performance", "CA1801:ReviewUnusedParameters", MessageId = "isChecked")]
[SuppressMessage("Microsoft.Performance", "CA1804:RemoveUnusedLocals", MessageId = "fileIdentifier")]
static void FileNode(string name, bool isChecked)
{
    string fileIdentifier = name;
    string fileName = name;
    string version = String.Empty;
}

STAThread는 시작시 응용 프로그램이 실수로 다른 인스턴스를 분리하지 못하도록하는 데 사용됩니까?
빛나는

7

머릿속 상단에는 큰 프로젝트 (~ 500k LoC)에서 실제로 사용하는 미리 정의 된 속성의 사용 빈도별로 대략적으로 정리 된 빠른 목록이 있습니다.

플래그, 직렬화 가능, WebMethod, COMVisible, TypeConverter, 조건부, ThreadStatic, 사용되지 않음, InternalsVisibleTo, DebuggerStepThrough.


2
1 ThreadStatic를 들어, 놀라 아무도 지금까지, 또한 통계적인 접근 방식을 언급하지 않았다
staafl

6

CodeSmith를 통해 데이터 엔터티 클래스를 생성하고 일부 유효성 검사 루틴에 특성을 사용합니다. 예를 들면 다음과 같습니다.

/// <summary>
/// Firm ID
/// </summary>
[ChineseDescription("送样单位编号")]
[ValidRequired()]
public string FirmGUID
{
    get { return _firmGUID; }
    set { _firmGUID = value; }
}

그리고 데이터 엔터티 클래스에 연결된 특성을 기반으로 유효성 검사를 수행하는 유틸리티 클래스가 있습니다. 코드는 다음과 같습니다.

namespace Reform.Water.Business.Common
{
/// <summary>
/// Validation Utility
/// </summary>
public static class ValidationUtility
{
    /// <summary>
    /// Data entity validation
    /// </summary>
    /// <param name="data">Data entity object</param>
    /// <returns>return true if the object is valid, otherwise return false</returns>
    public static bool Validate(object data)
    {
        bool result = true;
        PropertyInfo[] properties = data.GetType().GetProperties();
        foreach (PropertyInfo p in properties)
        {
            //Length validatioin
            Attribute attribute = Attribute.GetCustomAttribute(p,typeof(ValidLengthAttribute), false);
            if (attribute != null)
            {
                ValidLengthAttribute validLengthAttribute = attribute as ValidLengthAttribute;
                if (validLengthAttribute != null)
                {
                    int maxLength = validLengthAttribute.MaxLength;
                    int minLength = validLengthAttribute.MinLength;
                    string stringValue = p.GetValue(data, null).ToString();
                    if (stringValue.Length < minLength || stringValue.Length > maxLength)
                    {
                        return false;
                    }
                }
            }
            //Range validation
            attribute = Attribute.GetCustomAttribute(p,typeof(ValidRangeAttribute), false);
            if (attribute != null)
            {
                ValidRangeAttribute validRangeAttribute = attribute as ValidRangeAttribute;
                if (validRangeAttribute != null)
                {
                    decimal maxValue = decimal.MaxValue;
                    decimal minValue = decimal.MinValue;
                    decimal.TryParse(validRangeAttribute.MaxValueString, out maxValue);
                    decimal.TryParse(validRangeAttribute.MinValueString, out minValue);
                    decimal decimalValue = 0;
                    decimal.TryParse(p.GetValue(data, null).ToString(), out decimalValue);
                    if (decimalValue < minValue || decimalValue > maxValue)
                    {
                        return false;
                    }
                }
            }
            //Regex validation
            attribute = Attribute.GetCustomAttribute(p,typeof(ValidRegExAttribute), false);
            if (attribute != null)
            {
                ValidRegExAttribute validRegExAttribute = attribute as ValidRegExAttribute;
                if (validRegExAttribute != null)
                {
                    string objectStringValue = p.GetValue(data, null).ToString();
                    string regExString = validRegExAttribute.RegExString;
                    Regex regEx = new Regex(regExString);
                    if (regEx.Match(objectStringValue) == null)
                    {
                        return false;
                    }
                }
            }
            //Required field validation
            attribute = Attribute.GetCustomAttribute(p,typeof(ValidRequiredAttribute), false);
            if (attribute != null)
            {
                ValidRequiredAttribute validRequiredAttribute = attribute as ValidRequiredAttribute;
                if (validRequiredAttribute != null)
                {
                    object requiredPropertyValue = p.GetValue(data, null);
                    if (requiredPropertyValue == null || string.IsNullOrEmpty(requiredPropertyValue.ToString()))
                    {
                        return false;
                    }
                }
            }
        }
        return result;
    }
}
}


5

[System.Security.Permissions.PermissionSetAttribute] 선언적 보안을 사용하여 PermissionSet에 대한 보안 조치를 코드에 적용 할 수 있습니다.

// usage:
public class FullConditionUITypeEditor : UITypeEditor
{
    // The immediate caller is required to have been granted the FullTrust permission.
    [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
    public FullConditionUITypeEditor() { }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.