صافي سمات: لماذا GetCustomAttributes () جعل مثيل سمة جديدة في كل مرة؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

وهكذا كنت ألعب حول أكثر قليلا مع سمات في. NET، وأدرك أن كل دعوة إلى Type.GetCustomAttributes () بإنشاء مثيل جديد من السمة بلدي. لماذا هذا؟ أعتقد أن على سبيل المثال السمة ستكون أساسا المفرد و memberinfo لكل، مع 1 مثلا منضمة إلى نوع، PropertyInfo، الخ ...

وهنا هي لغتي رمز اختبار:

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

وأين "الطبقة محمل" (آسف، لدي أكثر من خلفية جافا، لست متأكدا 100٪ كيف صافي يحمل أنواعه) بتجميع MyClass، وإنشاء مثيل MyAttribAttribute، وتخزينها معا في مكان ما. (ربما بيرم الجنرال في كومة إذا كانت هذه جافا) وتدعو إلى GetCustomAttributes 2 () وعندئذ فقط العودة في نفس مثيل إنشاؤها في وقت سابق.

ولكن الانتاج الفعلي هو:

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

وهكذا ... لماذا؟ يبدو مثل إنشاء مثيل جديد من كل هذه الأشياء عن كل مكالمة زائدة بعض الشيء، وليس جيدا لإدارة الأداء / الذاكرة. هل هناك أي طريقة للحصول دائما على نفس مثيل مرارا وتكرارا؟

وأي شخص يحصل على أي أفكار لماذا تم تصميمه بهذه الطريقة؟

والسبب يهمني على الإطلاق لأنني جعلت يعزو العرف الذي يحمل داخليا بعض المعلومات التحقق من صحة، وذلك في سمة لدي أساسا "منطقي الخاص المصادق عليها" أن أحدد إلى true. الاشياء التحقق من صحة يأخذ بعض الوقت، لذلك أنا لا أريد لتشغيله في كل مرة. والمشكلة الآن هي أنه منذ إنشاء مثيل جديد من السمة في كل مرة أحصل على الصفات، والمصادق عليها دائما "كاذبة".

هل كانت مفيدة؟

المحلول

كائن خلق رخيص.

إذا كان لديك سمة مثل

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