.NET 속성 : GetCustomAttributes ()가 매번 새 속성 인스턴스를 만드는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/417275

  •  03-07-2019
  •  | 
  •  

문제

그래서 .NET의 속성으로 조금 더 연주하고 있었고, 모든 유형의 호출을 type.getCustomAttributes ()가 내 속성의 새 인스턴스를 만듭니다. 왜 그런 겁니까? 속성 인스턴스는 기본적으로 유형, PropertyInfo 등에 1 인스턴스가 바인딩되는 싱글 톤의 싱글 톤이 될 것이라고 생각합니다.

내 테스트 코드는 다음과 같습니다.

using System;

namespace AttribTest
{
[AttributeUsage(AttributeTargets.Class)]
class MyAttribAttribute : Attribute
{
    public string Value { get; set; }

    public MyAttribAttribute()
        : base()
    {
        Console.WriteLine("Created MyAttrib instance");
    }
}

[MyAttrib(Value = "SetOnClass")]
class MyClass
{
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Getting attributes for MyClass.");
        object[] a = typeof(MyClass).GetCustomAttributes(false);
        ((MyAttribAttribute)a[0]).Value = "a1";

        Console.WriteLine("Getting attributes for MyClass.");
        a = typeof(MyClass).GetCustomAttributes(false);
        Console.WriteLine(((MyAttribAttribute)a[0]).Value);

        Console.ReadKey();
    }
}
}

이제 속성을 구현해야했고, 출력은 다음과 같습니다.

Created MyAttrib instance
Getting attributes for MyClass.
Getting attributes for MyClass.
a1

"클래스 로더"(죄송합니다. (아마도 자바 인 경우 힙의 파마 일 것입니다.

그러나 실제 출력은 다음과 같습니다.

Getting attributes for MyClass.
Created MyAttrib instance
Getting attributes for MyClass.
Created MyAttrib instance
SetOnClass

왜? 모든 통화에 대해 이러한 모든 객체의 새로운 인스턴스를 만드는 것은 약간 과도하며 성능/메모리 관리에 좋지 않은 것 같습니다. 항상 동일한 인스턴스를 반복해서 얻는 방법이 있습니까?

누구든지 왜 이런 식으로 설계된 아이디어가 있습니까?

내가 전혀 신경 쓰는 이유는 내부적으로 일부 유효성 검사 정보를 보유하는 사용자 지정 속성을 만들었 기 때문입니다. 따라서 속성에는 기본적으로 "개인 부울 검증"이있어 TRUE로 설정했습니다. 검증 작업에는 시간이 걸리므로 매번 실행하고 싶지 않습니다. 이제 문제는 속성을 얻을 때마다 속성의 새 인스턴스를 생성하므로 검증 된 것이 항상 "false"라는 것입니다.

도움이 되었습니까?

해결책

객체 생성은 저렴합니다.

당신이 같은 속성이 있다면

public class MyAttribute : Attribute {
    public virtual string MyText { get; set; }
}

그리고 그것을 수업과 같은 수업에 적용했습니다

[MyAttribute(MyText="some text")]
public class MyClass {
}

그리고 당신은 좋아하는 것을 검색했습니다

var attr =
    typeof(MyClass).GetCustomAttributes(typeof(MyAttribute), false)
    .Cast<MyAttribute>().Single();

그리고 당신은 그것과 같은 속성을 설정했습니다

attr.MyText = "not the text we started with";

무엇 ~해야 한다 일어난 일 ~일 것이다 다음에 전화 할 때 발생합니다

Console.WriteLine(
    typeof(MyClass).GetCustomAttributes(typeof(MyAttribute), false)
    .Cast<MyAttribute>().Single().Name
);

?

다른 팁

속성은 메모리에 객체로 저장되지 않으며 어셈블리에서 메타 데이터로만 저장됩니다. 당신이 그것을 쿼리 할 때, 그것은 구성되고 반환되며, 일반적으로 속성은 객체를 버리기 때문에 런타임이 다시 필요한 경우를 대비하여 런타임을 유지하기 위해서는 아마도 많은 메모리를 낭비 할 수 있습니다.

요컨대, 공유 정보를 저장하는 다른 방법을 찾아야합니다.

여기에 있습니다 선적 서류 비치 속성에.

속성이 메타 데이터에 저장되기 때문입니다. 속성은 "사용자 친화적 인 속성 이름"등과 같은 정보에 사용해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top