En Faydalı Özellikler [kapalı]


784

Özelliklerin son derece yararlı olduğunu biliyorum. [Browsable(false)]Özellikler sekmesinde özellikleri gizlemenize izin veren önceden tanımlanmış olanlar vardır . İşte öznitelikleri açıklayan iyi bir soru: .NET'te öznitelikler nelerdir?

Projelerinizde kullandığınız önceden tanımlanmış özellikler (ve ad alanları) nelerdir?


27
Ne sorusu? , tüm sayfa harika açıklamalarla güzel cevaplarla dolup taştı. Ben bu konuyu okurken, birçok uzmanla görüşmeleri hakkında deneyimim oldu. Soru için +100.
Muthu Ganapathy Nathan

Katılıyorum, bunun gibi sorular en değerli sorulardan bazıları - SO'nun kapanması için daha az kullanışlı olmasını sağlıyor.
David Thielen

Yanıtlar:


669

[DebuggerDisplay]hata ayıklama sırasında Type örneğinin üzerine geldiğinizde bir Type'ın özelleştirilmiş çıktısını hızlı bir şekilde görmek gerçekten yararlı olabilir. misal:

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

Hata ayıklayıcıda şu şekilde görünmelidir:

alternatif metin

Ayrıca, özellik kümesi [WebMethod]ile özniteliğin CacheDurationweb hizmeti yönteminin gereksiz yürütülmesini önleyebileceğini belirtmek gerekir .


62
Vay canına, bunu bilmek gerçekten çok iyi. Genellikle aynı şeyi ToString'i geçersiz kılarak başardım, ama bu daha iyi.
Brian

17
Buna dikkat edin, CPU'nuzdan ToString'e göre çok daha büyük yığınlar ısırır.
Nikola Radosavljević

1
Bunu yöntemlerin sonucunu görüntülemek için de kullanabilirsiniz. Bu, yöntemin (veya özellik edinmenin) yan etkileri varsa, oldukça karmaşık bir hata ayıklama deneyimi sağlayabilir.
Øyvind Skaar

4
@ NikolaRadosavljević hata ayıklama sırasında sadece CPU gücünü alacak mı
Nickolay Kondratyev

2
@Nickolay Kondratyev: Tüm giriş ve çıkışları bilmiyorum, ancak sizi bazı sonuçlara götürebilecek web hizmeti en iyi uygulamalarını takip edebilirsiniz: blogs.msdn.com/b/jaredpar/archive/2011/03/ 18 /…
Nikola Radosavljević

273

System.Obsoletebence çerçevedeki en kullanışlı özelliklerden biri. Artık kullanılmaması gereken kodlar hakkında uyarı yapma yeteneği çok kullanışlıdır. Geliştiricilere bir şeyin artık kullanılmaması gerektiğini söylemenin yanı sıra nedenini açıklamanın ve bir şeyi yapmanın daha iyi / yeni yolunu göstermenin bir yoluna sahip olmayı seviyorum.

Conditional attributeAyıklama kullanımı için de oldukça kullanışlıdır. Kodunuzu, serbest bırakma için çözümünüzü oluşturduğunuzda derlenmeyecek hata ayıklama amaçları için yöntemler eklemenize olanak tanır.

Daha sonra yararlı bulduğum Web Denetimlerine özgü birçok özellik var, ancak bunlar daha spesifik ve bulduğumdan sunucu denetimlerinin geliştirilmesi dışında herhangi bir kullanımı yok.


50
"True" parametresini System.Obsolete parametresinden biri olarak iletebilirsiniz; bu da uyarının hata olmasına ve derlemeyi bozmasına neden olur. Açıkçası bu, tüm uyarıları temizledikten sonra yapılmalıdır. :)
Adrian Clark

14
Tüm uyarıları temizledikten sonra, yöntemi silmek daha iyi olmaz mı?
Pedro

10
@Pedro: Bazen geriye dönük uyumluluk nedeniyle yapamazsınız. Özel ve kullanılmamışsa, evet, silin.
Fantius

3
@plinth Bir istisna atmak birçok nedenden ötürü kötü bir fikir olabilir, # 1 Obsolete () kullanmanın ana nedeninin derlenmiş kodun bir geçiş aşamasındayken çalışmaya devam etmesidir. Kimsenin yöntemi çağırmasına izin vermiyorsanız, neden sadece silmiyorsunuz?
Dan Herbert

17
@plinth Yeni kodun yöntemi kullanmasını önlemek içindir . Bir yöntem geçersiz olarak işaretlenmişse eski kod ikili uyumlu kalır, ancak bir istisna atarsanız çalışmayı durdurur. Birisi "Eskimiş" bayrağını dolaşmak için yansıma kullanıyorsa, o zaman daha kötü problemleriniz var ...
Dan Herbert

204

[Flags]oldukça kullanışlıdır. Emin olmak için sözdizimsel şeker, ama yine de oldukça güzel.

[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 öyle: anladım, ve oldukça bu özellik için benim coşku azaltan hangi olmasaydı şey işaret değil numaralandırma değişkenler için geçerli değerler olarak biraz kombinasyonları, derleyici bakılmaksızın sayımları için bu izin verir izin derleyici talimat. Benim C ++ arka plan ile gösterilen ... nefes


Peki, Flags özelliği tam olarak ne yapar?
Andrei Rînea

13
Umarım Flags özniteliğinin hepsini bozduğunu fark edersiniz. TypeConverter dışında hiç gerekli değildir / kullanılmaz.
leppie

3
@ leppie: ToString () de. Ama ... vay. Bazı nedenlerden dolayı, numaralandırma davranış özniteliği C ++ ile aynı olmasını bekliyordum: veya değerleri bir tamsayı üretmek (enum param bekliyor yöntemine olduğu gibi geçirilemez). Şimdi görüyorum ki durum böyle değil. Zayıf ... tamam, .NET enums emmek.
Shog9

2
[Flags] gerçekten sadece hata ayıklayıcı ve .ToString () fonksiyonlarının bir değerin potansiyel olarak numaralandırmadaki birkaç bildirimin birleşimi olduğunu bilmesine yardımcı olur. Emin değilim, Intellisense'nin numaralandırmayı daha etkili kullanmanıza yardımcı olabilir.
Kenzi

31
[Flags]sözdizimsel şeker olmaktan daha büyük bir kullanımı vardır. Web servislerini kullanırken, benzer bir değer SandwichStuff.Cheese | SandwichStuff.Ham | SandwichStuff.Jamiletilirse serileştirme / serileştirme çalışmaz . [Flags]Öznitelik olmadan, serileştirici değerin bayrakların bir kombinasyonu olabileceğini bilemez. WCF'nin neden çalışmadığını düşünmek için yaklaşık iki gün geçirdikten sonra bunu zor yoldan öğrendim.
Anchit

177

[DebuggerStepThrough]System.Diagnostics'ten hoşlanıyorum .

Bu tek satırlık hiçbir şey yapma yöntemlerine veya özelliklerine girmekten kaçınmak için çok kullanışlıdır (otomatik özellikler olmadan erken bir .Net'te çalışmaya zorlanıyorsanız). Özniteliği kısa bir yönteme veya bir mülkün alıcısına veya ayarlayıcısına koyun, hata ayıklayıcıda "adımla" tuşuna bassanız bile sağa uçun.


5
Pek çok kez keşke bu özellik hakkında
bilmek

1
Kapaklarla kırılmış bir utanç - daha fazla bilgi için gregbeech.com/blogs/tech/archive/2008/10/17/… adresine bakın .
Greg Beech

3
Ayrıca :) çalıştığını bildiğiniz herhangi WM_PAINT Kodu için kullanılan yaklaşımlar
Pondidum

@GregBeech Bu URL bir .NET hatası döndürür. Şık! :)
smdrager

@smdrager - Geçici bir sorun olmalı, bugün benim için çalışıyor gibi görünüyor.
Greg Beech

135

Değer için, burada tüm .NET özniteliklerinin bir listesi . Birkaç yüz var.

Başka kimseyi tanımıyorum ama yapacak ciddi bir RTFM'im var!


33
posta listesi .net 1.1 içindir. 3.5 msdn.microsoft.com/en-us/library/system.attribute.aspx için liste (biraz aşağı kaydırmanız gerekir)
kay.one

2
Sorudaki bağlantı güncellendi. Şimdi liste 3.5
R. Martinho Fernandes

8
Aslında 3.5 ile değil, en son linkler.
Brian Ortiz

1
Şimdi sadece liste sadece bir bağlantı listesi değil, isim ve açıklama olsaydı. Oh iyi. @BrianOrtiz haklı. Liste 4.5 sürümündedir.
Aydınlık

Hedeflediğiniz çerçeveyi "Diğer Sürümler" yazdığı yerden değiştirirsiniz.
Novaterata

129

Benim oyum Conditional

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

Bunu, gelişmiş hata ayıklama özelliklerine sahip bir işlev eklemek için kullanabilirsiniz; gibi Debug.Write, sadece hata ayıklama yapılarında çağrılır ve böylece programınızın ana akışı dışında karmaşık hata ayıklama mantığını kapsüllemenizi sağlar.


5
DEBUG yapmak #if ile aynı değil mi?
Neil N

10
Bir şekilde, #B DEBUG, Conditioinal çağrıdan ayrılır ancak JIT'de ortadan kaldırılan bir NOP yaparken, arayan kişinin de aramaması gerektiği anlamına gelir.
Rangoric

23
Ayrıca, genellikle #if DEBUG çağrıları ve [Koşullu] yöntemlerini kullanırsınız . Bu nedenle, 100 hata ayıklama yöntemini çağırırsanız, kapatmak 100 değil tek bir kod değişikliği meselesidir.
Steve Cooper

13
Rangoric'in yorumu açıkça yanlıştır (en azından C # için): yöntem değiştirilmeden dahil edilir; çağrı sitesinin kendisi atlandı. Bunun birkaç sonucu vardır: parametreler değerlendirilmez ve koşullu yöntem derleyicinin çıktısında değiştirilmemiş olarak bulunur. Bunu yansıma ile doğrulayabilirsiniz. msdn.microsoft.com/tr-tr/library/aa664622.aspx blogs.msdn.com/b/jmstall/archive/2007/10/15/…
Mark Sowul

97

Hep kullanmak DisplayName, Descriptionve DefaultValuebenim kullanıcı denetimleri, özel kontroller ya da ben bir özellik ızgara içinden düzenlemek edeceğiz herhangi bir sınıfın genel özelliklerini üzerinde bağlıyor. Bu etiketler, .NET PropertyGrid tarafından adı, açıklama panelini ve varsayılan değerlere ayarlanmamış kalın değerleri biçimlendirmek için kullanılır.

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

Keşke DescriptionXML yorumu bulunmazsa Visual Studio'nun IntelliSense'in özelliği dikkate almasını isterdim . Aynı cümleyi iki kez tekrarlamaktan kaçınacaktır.


3
Cant inanıyorum kimse Descriptionsana kadar işaret etti ..
Enums

68

[Serializable]xml gibi harici veri kaynaklarına veya uzak bir sunucudan gelen nesneleri serileştirmek ve serileştirmeyi kaldırmak için her zaman kullanılır. Burada daha fazlası.


Aslında bir psuedoattribute olarak adlandırılır, çünkü C #, [Serializable] için bir meta özellik örneği değil, bir meta veri bayrağı
yayınlar

1
Çok yararlı olsa da [Serializable] mükemmel olmaktan uzaktır. İstediğiniz sonucu elde etmek için çok fazla tinkering ve deneme yanılma gerektirir.
19'da shoosh

O şakayı ikinciyim!
John Bubriski

System.NonSerializedAttribute, otomatik serileştirme üzerinde daha fazla kontrol istiyorsanız yararlıdır.
CSharper

Bir yan not olarak, dahili .Net serileştirme performansının el yapımı koddan daha yavaş 2 veya 3 büyüklükte olduğu gibi oldukça zayıf olduğunu ekleyeceğim.
redcalx

57

Hofstadtian ruhunda, [Attribute]özellik çok faydalıdır, çünkü kendi niteliklerinizi bu şekilde yaratırsınız. Eklenti sistemleri uygulamak, Numaralandırmalara açıklama eklemek, çoklu dağıtım ve diğer hileleri simüle etmek için arayüzler yerine öznitelikler kullandım.


13
Kulağa hoş geliyor! Eklenti sistemi ve numaralandırma açıklamalarının bazı örneklerini göstermeyi düşünür müsünüz? Bunların ikisi de kendimi uygulamakla ilgilendiğim şeyler!
John Bubriski

46

İşte InternalsVisibleTo ilginç özelliği hakkında yazı . Temelde ne yapar C ++ arkadaşlar erişim işlevselliği taklit eder. Birim testi için çok kullanışlıdır.


7
Test edilemeyen / test edilmemesi gereken bir şey üzerinde birim testi kesmek için kullanışlı değil mi?
the_drow

@the_drow: 'Özel erişimciler' hakkında konuşuyorsunuz: msdn.microsoft.com/en-us/library/ms184807%28v=vs.80%29.aspx
habakuk

@habakuk: Pek değil. İç tasarımın, genellikle kötü tasarım nedeniyle birim testi için maruz kalması gereken durumlar vardır.
the_drow

2
@the_drow: InternalsVisibleTo'nun birim testi için kötü olduğunu söyleyemem; projeniz dışında görünmeyen daha küçük "birimler" oluşturabilir ve test edebilirsiniz (temiz ve küçük bir API'ye sahip olmanıza yardımcı olur). Ancak, bir şeyi test etmek için 'özel erişimcilere' ihtiyacınız varsa, muhtemelen yanlış bir şey vardır.
habakuk

10
@the_drow internalHerkese açık olmayan iddianıza katılmıyorum . Montajda test edilmekte ve montaj içindeki diğer sınıfların düzeltme işlevini üstlenebilmesi için birim test edilmelidir. Birim testi yapmazsanız, tüm tüketen sınıflarda işlevlerini test etmeniz gerekir.
tvanfosson


28

Ben önermek [TestFixture]ve [Test]- nUnit kütüphanesinden.

Kodunuzdaki birim testleri, yeniden düzenleme ve kodlanmış belgelerde güvenlik sağlar.


26
[XmlIgnore]

çünkü bu, kaydederken istisnalara neden olacak 'üst' nesneleri (herhangi bir xml serileştirmesinde) göz ardı etmenizi sağlar.


25

İyi adlandırılmamış, çerçevede iyi desteklenmemiştir ve bir parametre gerektirmemelidir, ancak bu özellik değişmez sınıflar için yararlı bir işarettir:

[ImmutableObject(true)]

6
Dokümanlara göre, sadece tasarım zamanında kullanılır (maalesef).
Hans Ke inging

1
Bunun sadece tasarım zamanı olduğu göz önüne alındığında, belki de kendi ImmutableObjectAttributesınıfınızı oluşturmak daha iyi olacaktır - en azından parametreyi ortadan kaldırabilirsiniz.
Roy Tinker

25

[ThreadStatic]Özniteliği iplik ve yığın tabanlı programlama ile birlikte kullanmayı seviyorum . Örneğin, bir çağrı dizisinin geri kalanı ile paylaşmak istediğim bir değer istiyorum, ancak bant dışında (yani çağrı parametrelerinin dışında) yapmak istiyorum, ben böyle bir şey istihdam edebilir.

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

Daha sonra benim kod, benim kod aşağı akış insanlara bant dışında bağlamsal bilgi sağlamak için kullanabilirsiniz. Misal:

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

ThreadStatic özniteliği, çağrıyı yalnızca söz konusu iş parçacığına dahil etmeme olanak tanıyor.


ve nasıl erişilir? Kullanım örneğinizin amacını burada anlamayın. Açıklayabilir misin?
Beachwalker

@Beachwalker Akım statik olmalı, şimdi düzenlenmelidir. Artık MyContextInformation.Currentyığındaki etkin içeriği almak için erişebilirsiniz . Bu, bazı durumlarda çok iyi bir kavramdır, (şirketim) motorumuz bunu birçok amaç için kullanır.
Felix K.4

23

DebuggerHiddenAttribute debug edilmemelidir koduna adım kaçınarak sağlar.

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()); 

Ayrıca, yığın izlemesinde yöntemlerin gösterilmesini önler, başka bir yöntemi saran bir yönteme sahip olduğunda yararlıdır:

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

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

Şimdi çağırırsanız GetElementAt(new Vector2(10, 10))ve kaydırılan yöntemde bir hata oluşursa, çağrı yığını, hatayı atan yöntemi çağıran yöntemi göstermez.


21

DesignerSerializationVisibilityAttributeçok kullanışlı. Bir denetim veya bileşene bir çalışma zamanı özelliği koyduğunuzda ve tasarımcının bunu serileştirmesini istemediğinizde, bunu şu şekilde kullanırsınız:

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

4
WinForms bileşenleri için çok kullanışlıdır. [Browsable (false)] ile birlikte kullanım
Mark Heath

3
İyi bir nokta - [Browsable(false)]tasarımcının kullanıcısından gizlemek için gereklidir, bu nerede [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]gerekli olursa seri hale getirilmez.
yapılandırıcı

17

Sadece birkaç özellik derleyici desteği alır, ancak özelliklerin çok ilginç bir kullanımı AOP'tadır : PostSharp , IL'yi yöntemlere enjekte etmek için ısmarlama niteliklerinizi kullanır ve her türlü yeteneğe izin verir ... log / trace önemsiz örneklerdir - ancak diğer bazı iyi örnekler otomatik INotifyPropertyChanged uygulaması gibi şeylerdir ( burada ).

Derleyiciyi veya çalışma zamanını doğrudan meydana getiren ve etkileyen bazıları :

  • [Conditional("FOO")] - bu yönteme çağrılar (bağımsız değişken değerlendirmesi dahil) yalnızca derleme sırasında "FOO" sembolü tanımlanırsa gerçekleşir
  • [MethodImpl(...)] - senkronizasyon, satır içi gibi birkaç şeyi belirtmek için kullanılır
  • [PrincipalPermission(...)] - güvenlik kontrollerini otomatik olarak koda enjekte etmek için kullanılır
  • [TypeForwardedTo(...)]- arayanları yeniden oluşturmadan türleri derlemeler arasında taşımak için kullanılır

Yansıma ile manuel olarak kontrol edilen şeyler için - Ben System.ComponentModelözniteliklerin büyük bir hayranıyım ; gibi şeyler [TypeDescriptionProvider(...)], [TypeConverter(...)]ve [Editor(...)]bu tamamen veri bağlayıcı senaryolar (yani dinamik özellikleri vs.) türleri davranışını değiştirebilir.


15

Ben bir kod kapsama tarama yapmak olsaydı, bu iki üst olacağını düşünüyorum:

 [Serializable]
 [WebMethod]

15
[WebMethod], bir web hizmetinde açıklanan yöntemi süslemek için kullanılır. [Serializable], nesnelerinizi uygulama etki alanlarından geçirme gibi amaçlarla serileştirilebilecek şekilde işaretler.
Kev

15

[DataObjectMethod]Son zamanlarda kullanıyorum . Sınıfınızı ObjectDataSource (veya diğer denetimler) ile kullanabilmeniz için yöntemi açıklar.

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

Daha fazla bilgi


12

Mevcut projemizde,

[ComVisible(false)]

Tek bir yönetilen türün veya üyenin veya bir montaj içindeki tüm türlerin COM'a erişilebilirliğini kontrol eder.

Daha fazla bilgi


12
[TypeConverter(typeof(ExpandableObjectConverter))]

Tasarımcıya sınıf olan özellikleri (denetiminizin) genişletmesini söyler

[Obfuscation]

Birleştirme, tür veya üye için belirtilen eylemleri gerçekleştirmesi için gizleme araçlarına talimat verir. (Genellikle bir Montaj düzeyi kullanmanıza rağmen[assembly:ObfuscateAssemblyAttribute(true)]


1
Tahmin ettim ama yanılmışım. Gizleme özelliği yalnızca üçüncü taraf görevliler için bir ipucudur. Derleyicinin varsayılan olarak hiçbir şeyi gizlemesine neden olmaz.
Dan Is Fiddling By Firelight

@DanNeely Visual Studio Pro / Ultimate kullanıcıları için ücretsiz!
Chris S

4
DotFuscator Topluluk Sürümü'ne atıfta bulunuyorsanız, koruma düzeyi o kadar düşüktür ki en iyi ihtimalle hiçbir şey için zar zor sayılmaz.
Dan Is Fiddling By Firelight

@ricovox Bir özet ekledim
Chris S

9

En çok kullandığım özellikler XML Serileştirme ile ilgili özelliklerdir.

XmlRoot

XmlElement

XmlAttribute

vb...

Herhangi bir hızlı ve kirli XML ayrıştırma veya serileştirme yaparken son derece kullanışlıdır.


8

Sevdiğim orta seviye bir geliştirici olmak

System.ComponentModel.EditorBrowsableAttribute UI geliştiricisinin görmeleri gerekmeyen özelliklerle boğulmaması için özellikleri gizlememe izin verir.

System.ComponentModel.BindableAttributeBazı şeylerin veriye bağlı olması gerekmez. Yine, kullanıcı arayüzü geliştiricilerinin yapması gereken işi azaltır.

DefaultValueLawrence Johnston'ın bahsettiği şeyi de seviyorum .

System.ComponentModel.BrowsableAttributeve Flagsdüzenli olarak kullanılır.

Kullandığım System.STAThreadAttribute System.ThreadStaticAttribute gerektiğinde.

Bu arada. Bunlar .Net çerçeve geliştiricileri için de aynı derecede değerlidir.


8

[EditorBrowsable(EditorBrowsableState.Never)]proje çözümünüzde değilse özellikleri ve yöntemleri IntelliSense'ten gizlemenize olanak tanır. Akıcı arayüzler için geçersiz akışları gizlemek için çok yararlıdır. Ne sıklıkla GetHashCode () veya Equals () istiyorsunuz?

MVC [ActionName("Name")], aynı yöntem imzası ile bir Get eylemi ve Post eylemine sahip olmanıza veya eylem adında tire kullanmanıza izin verir, aksi takdirde bunun için bir rota oluşturmadan mümkün olmaz.


8

Burada, aşağıdaki özelliklerin de çok önemli olduğunu belirtmenin önemli olduğunu düşünüyorum:

STAThreadAttribute 

Bir uygulama için COM iş parçacığı modelinin tek iş parçacıklı daire (STA) olduğunu gösterir.

Örneğin, bu özellik Windows Forms Uygulamalarında kullanılır:

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

Ve ayrıca ...

SuppressMessageAttribute

Belirli bir statik analiz aracı kural ihlali raporlamasını bastırır ve tek bir kod artefaktı üzerinde birden fazla bastırmaya izin verir.

Örneğin:

[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, uygulamanızın başlangıçta yanlışlıkla başka bir örneğini kapatmasını önlemek için kullanılıyor mu?
Aydınlık

7

Başımın üst kısmında, aslında büyük bir projede (~ 500k LoC) kullandığım önceden tanımlanmış özelliklerin kabaca kullanım sıklığına göre sıralanmış hızlı bir listesi:

Serializable, WebMethod, COMVisible, TypeConverter, Koşullu, ThreadStatic, Eskimiş, InternalsVisibleTo, DebuggerStepThrough.


2
ThreadStatic için +1, şimdiye kadar hiç kimsenin bahsetmediğini ve istatistiksel yaklaşım için
şaşırttı

6

CodeSmith aracılığıyla veri varlık sınıfı oluşturur ve bazı doğrulama yordamı için öznitelikleri kullanır. İşte bir örnek:

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

Ve veri varlık sınıfına ekli özniteliklere dayalı doğrulama yapmak için bir yardımcı sınıf var. İşte kod:

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] izin güvenliği kullanarak koda bir PermissionSet uygulanmasına yönelik güvenlik eylemlerine izin verir.

// usage:
public class FullConditionUITypeEditor : UITypeEditor
{
    // The immediate caller is required to have been granted the FullTrust permission.
    [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
    public FullConditionUITypeEditor() { }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.