source

가장 유용한 속성

myloves 2023. 5. 28. 23:25

가장 유용한 속성

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

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

[DebuggerDisplay]디버깅 중에 유형의 인스턴스 위에 마우스를 놓으면 사용자 지정된 유형의 출력을 빠르게 볼 수 있습니다.예:

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

디버거에서는 다음과 같이 표시됩니다.

alt 텍스트

또한, 언급할 가치가 있습니다.[WebMethod]이 " 다키시귀"입니다.CacheDuration속성 집합은 웹 서비스 메서드의 불필요한 실행을 방지할 수 있습니다.

System.Obsolete 프레임워크에서 가장 유용한 속성 중 하나라고 생각합니다.더 이상 사용해서는 안 되는 코드에 대한 경고를 표시하는 기능은 매우 유용합니다.저는 개발자들에게 더 이상 어떤 것이 사용되어서는 안 된다고 말할 수 있는 방법과 그 이유를 설명하고 어떤 것을 하는 더 나은/새로운 방법을 지적할 수 있는 방법을 갖는 것을 좋아합니다.

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

웹 컨트롤에는 유용하다고 생각되는 많은 속성이 있지만, 이러한 속성은 더 구체적이며 내가 찾은 서버 컨트롤 개발 이외에는 사용할 수 없습니다.

[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++ 배경은...한숨

시스템이 좋아요.진단.

이 도구는 한 줄로 아무 것도 하지 않는 방법이나 속성(조기 작업이 필요한 경우)을 피하는 데 매우 유용합니다.자동 속성이 없는 네트).속성을 짧은 메소드나 속성의 게터 또는 세터에 두면 디버거에서 "스텝 인"을 눌러도 바로 이동할 수 있습니다.

다음은 모든 .NET 특성 목록입니다.수백 개가 있습니다.

저는 다른 사람에 대해서는 모르지만 저는 진지한 RTFM을 해야 합니다!

저는 찬성합니다.

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

하여 고급 디버깅할 수 . 예를 들어 이 기 을 함 추 를 수 있 할 습 니 다 가 수 있 는 능 이 기 사 능 용 깅 디 고 버 하 여 급 ▁features ▁debugging ;Debug.Write디버그 빌드에서만 호출되므로 프로그램의 메인 플로우 밖에서 복잡한 디버그 로직을 캡슐화할 수 있습니다.

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

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

저는 비주얼 스튜디오의 인텔리센스가DescriptionXML 주석을 찾을 수 없는 경우 계정에 속성을 지정합니다.이것은 같은 문장을 두 번 반복하지 않아도 될 것입니다.

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

에서는 프슈타트정서신에의주호,서▁the▁in에정,[Attribute]속성은 사용자가 자신의 속성을 만드는 방법이기 때문에 매우 유용합니다.인터페이스 대신 속성을 사용하여 플러그인 시스템을 구현하고, Enums에 설명을 추가하고, 여러 번의 디스패치를 시뮬레이션하고, 기타 트릭을 수행했습니다.

여기 흥미로운 속성 InternalsVisibleTo에 대한 게시물이 있습니다.기본적으로 C++ 친구 액세스 기능을 모방합니다.유닛 테스트에 매우 유용합니다.

저는 꽤 유용하다는 것을 알게 되었습니다.

는 생각엔을 추천합니다[TestFixture]그리고.[Test]nUnit 라이브러리에서.

코드의 장치 테스트는 리팩터링 및 성문화된 문서에 안전성을 제공합니다.

[XmlIgnore]

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

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

[ImmutableObject(true)]

나는 그것을 사용하는 것을 좋아합니다.[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;
    }
}

나중에 코드에서 이것을 사용하여 코드에서 다운스트림으로 사용자에게 Out of Band 상황 정보를 제공할 수 있습니다.예:

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

ThreadStatic 특성을 사용하면 스레드 간의 데이터 액세스라는 복잡한 문제를 방지하기 위해 해당 스레드에 대해서만 호출 범위를 지정할 수 있습니다.

디버거디버깅해서는 안 되는 코드로의 단계를 피할 수 있는 숨겨진 특성입니다.

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))그리고 오류가 발생합니다. 호출 스택은 오류를 발생시키는 메서드를 호출하는 메서드를 표시하지 않습니다.

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

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

컴파일러 지원을 받는 속성은 몇 가지에 불과하지만 AOP에서 매우 흥미로운 사용법이 있습니다. PostSharp는 맞춤형 속성을 사용하여 메서드에 IL을 주입하여 모든 종류의 기능을 허용합니다.로그/추적은 사소한 예이지만 다른 좋은 예로는 자동 INOTIFY와 같은 것들이 있습니다.속성 변경된 구현(여기).

컴파일러 또는 런타임에 직접적으로 영향을 미치는 몇 가지 사항:

  • [Conditional("FOO")]평가 에 호출은 "FOO" 중에 합니다.
  • [MethodImpl(...)]동기화, 인라인과 같은 몇 가지를 나타내는 데 사용됩니다.
  • [PrincipalPermission(...)]를 자동으로 하는 데 됩니다.
  • [TypeForwardedTo(...)]호출자를 재구성하지 않고 어셈블리 간에 유형을 이동하는 데 사용됩니다.

반사를 통해 수동으로 확인하는 것들 - 저는 팬입니다.System.ComponentModel 성속것; 들은같과 같은 [TypeDescriptionProvider(...)],[TypeConverter(...)],그리고.[Editor(...)]데이터 바인딩 시나리오(즉, 동적 속성 등)에서 유형의 동작을 완전히 변경할 수 있습니다.

코드 커버리지 크롤을 수행한다면, 이 두 가지가 최고일 것입니다.

 [Serializable]
 [WebMethod]

나는 그것을 사용해 왔습니다.[DataObjectMethod] 컨트롤할 수 합니다.클래스를 ObjectDataSource(또는 다른 컨트롤)와 함께 사용할 수 있도록 메서드에 대해 설명합니다.

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

추가 정보

현재 프로젝트에서 우리는

[ComVisible(false)]

개별 관리 유형 또는 구성원 또는 어셈블리 내의 모든 유형에 대한 COM 액세스를 제어합니다.

추가 정보

[TypeConverter(typeof(ExpandableObjectConverter))]

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

[Obfuscation]

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

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

XmlRoot

XmlElement

XmlAttribute

기타...

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

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

System.ComponentModel.EditorBrowsableAttributeUI 개발자가 볼 필요가 없는 속성으로 가득 차지 않도록 속성을 숨길 수 있습니다.

System.ComponentModel.BindableAttribute어떤 것들은 데이터 바인딩이 필요하지 않습니다.다시 말하지만, UI 개발자가 해야 할 작업이 줄어듭니다.

저는 또한 좋아합니다.DefaultValue로런스 존스턴이 말한 것처럼

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

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

그나저나.나는 이것들이 모든 사람들에게 그만큼 가치가 있습니다.넷 프레임워크 개발자.

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

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

여기서 언급해야 할 중요한 점은 다음과 같은 특성도 매우 중요하다고 생각합니다.

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;
}

다음은 사용 빈도에 따라 대략적으로 정렬된 빠른 목록입니다. 실제로 대규모 프로젝트(약 50만 LoC)에서 사용하는 사전 정의된 속성입니다.

플래그, 직렬화 가능, 웹 메서드, COMVisible, 유형 변환기, 조건부, 스레드 정적, 사용되지 않음, 내부 표시 대상, 디버거 단계통해.

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;
    }
}
}

[DeploymentItem("myFile1.txt")] 배포에 관한 MSDN 문서항목

이 기능은 파일에 대해 테스트하거나 파일을 테스트에 대한 입력으로 사용하는 경우에 매우 유용합니다.

[System.Security.Permissions.PermissionSetAttribute]에서는 보안을 &gt; &gt; &gt; &;에 보안 을 허용합니다.선언적 보안을 사용하는 코드에 적용되도록 설정합니다.

// usage:
public class FullConditionUITypeEditor : UITypeEditor
{
    // The immediate caller is required to have been granted the FullTrust permission.
    [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
    public FullConditionUITypeEditor() { }
}

언급URL : https://stackoverflow.com/questions/144833/most-useful-attributes