Aracılığıyla paylaş


Öznitelikler (F#)

Öznitelikler, meta verilerin bir programlama yapısına uygulanmasını sağlar.

Sözdizimi

[<target:attribute-name(arguments)>]

Açıklamalar

Önceki söz diziminde, hedef isteğe bağlıdır ve varsa özniteliğin uygulanacağı program varlığının türünü belirtir. hedef için geçerli değerler, bu belgenin ilerleyen bölümlerinde gösterilen tabloda gösterilir.

öznitelik-adı, genellikle öznitelik türü adlarında kullanılan Attribute sonekini içeren veya içermeyen, geçerli bir öznitelik türünün adını (muhtemelen ad alanlarıyla nitelikli) ifade eder. Örneğin, tür ObsoleteAttribute yalnızca bu bağlamda Obsolete olarak kısaltılabilir.

bağımsız değişkenleri, öznitelik türü için oluşturucunun bağımsız değişkenleridir. Bir özniteliğin parametresiz oluşturucu varsa, bağımsız değişken listesi ve parantezler atlanabilir. Öznitelikler hem konumsal bağımsız değişkenleri hem de adlandırılmış bağımsız değişkenleri destekler. Konumsal bağımsız değişkenler, göründükleri sırada kullanılan bağımsız değişkenlerdir. Özniteliğin genel özellikleri varsa, adlandırılmış bağımsız değişkenler kullanılabilir. Bunları, bağımsız değişken listesinde aşağıdaki söz dizimini kullanarak ayarlayabilirsiniz.

property-name = property-value

Bu tür özellik başlatmaları herhangi bir sırada olabilir, ancak mutlaka konumsal bağımsız değişkenlerden sonra gelmelidir. Aşağıda, konumsal bağımsız değişkenler ve özellik başlatmaları kullanan bir öznitelik örneği verilmiştir:

open System.Runtime.InteropServices

[<DllImport("kernel32", SetLastError=true)>]
extern bool CloseHandle(nativeint handle)

Bu örnekte, DllImportAttributeözniteliği kısaltılmış biçimde kullanılmıştır. İlk bağımsız değişken bir konumsal parametre, ikincisi ise bir özelliktir.

Öznitelikler, özniteliği olarak bilinen bir nesnenin bir tür veya başka bir program öğesiyle ilişkilendirilmesine sağlayan bir .NET programlama yapısıdır. Özniteliğin uygulandığı program öğesi,öznitelik hedefi olarak bilinir. özniteliği genellikle hedefiyle ilgili meta veriler içerir. Bu bağlamda meta veriler, alanları ve üyeleri dışındaki türle ilgili herhangi bir veri olabilir.

F# içindeki öznitelikler şu programlama yapılarına uygulanabilir: işlevler, yöntemler, derlemeler, modüller, türler (sınıflar, kayıtlar, yapılar, arabirimler, temsilciler, numaralandırmalar, birleşimler vb.), oluşturucular, özellikler, alanlar, parametreler, tür parametreleri ve dönüş değerleri. Sınıflar, ifadeler veya iş akışı ifadeleri içindeki let bağlamalarında özniteliklere izin verilmez.

Genellikle öznitelik bildirimi, öznitelik hedefinin bildiriminden hemen önce görünür. Birden çok öznitelik bildirimi aşağıdaki gibi birlikte kullanılabilir:

[<Owner("Jason Carlson")>]
[<Company("Microsoft")>]
type SomeType1 =

.NET yansımasını kullanarak çalışma zamanında öznitelikleri sorgulayabilirsiniz.

Önceki kod örneğinde olduğu gibi birden çok özniteliği tek tek bildirebilir veya tek tek öznitelikleri ve oluşturucuları birbirinden ayırmak için noktalı virgül kullanırsanız bunları tek bir köşeli ayraç kümesinde bildirebilirsiniz:

[<Owner("Darren Parker"); Company("Microsoft")>]
type SomeType2 =

Genellikle karşılaşılan öznitelikler arasında Obsolete özniteliği, güvenlik konuları öznitelikleri, COM desteği öznitelikleri, kodun sahipliğiyle ilgili öznitelikler ve bir türün serileştirilip serileştirilemeyeceğini gösteren öznitelikler bulunur. Aşağıdaki örnekte Obsolete özniteliğinin kullanımı gösterilmektedir.

open System

[<Obsolete("Do not use. Use newFunction instead.")>]
let obsoleteFunction x y =
  x + y

let newFunction x y =
  x + 2 * y

// The use of the obsolete function produces a warning.
let result1 = obsoleteFunction 10 100
let result2 = newFunction 10 100

assembly ve moduleöznitelik hedefleri için, öznitelikleri derlemenizdeki üst düzey bir do bağlamasına uygularsınız. öznitelik bildirimine aşağıdaki gibi assembly veya ``module`` sözcüğünü ekleyebilirsiniz:

open System.Reflection
[<assembly:AssemblyVersionAttribute("1.0.0.0")>]
[<``module``:MyCustomModuleAttribute>]
do
   printfn "Executing..."

bir do bağlamasına uygulanan öznitelik için öznitelik hedefini atlarsanız, F# derleyicisi bu öznitelik için anlamlı olan öznitelik hedefini belirlemeye çalışır. Birçok öznitelik sınıfı, bu öznitelik için desteklenen olası hedefler hakkında bilgi içeren System.AttributeUsageAttribute türünde bir özniteliğine sahiptir. System.AttributeUsageAttribute özniteliğinin hedef olarak işlevleri desteklediğini gösteriyorsa, özniteliği programın ana giriş noktasına uygulamak için alınır. System.AttributeUsageAttribute özniteliğinin derlemeleri hedef olarak desteklediğini gösterirse, derleyici derlemeye uygulamak için özniteliğini alır. Özniteliklerin çoğu hem işlevler hem de derlemeler için geçerli değildir, ancak böyle durumlarda özniteliği programın ana işlevine uygulamak için alınır. Öznitelik hedefi açıkça belirtilirse, öznitelik belirtilen hedefe uygulanır.

Genellikle öznitelik hedefini açıkça belirtmeniz gerekmese de, bir öznitelikteki hedef için geçerli değerler ve kullanım örnekleri aşağıdaki tabloda gösterilmiştir:

Öznitelik hedefi Örnek
meclis
[<assembly: AssemblyVersion("1.0.0.0")>]
modül
[<``module``: MyCustomAttributeThatWorksOnModules>]
yöntem
[<MyCustomAttributeThatWorksOnMethods>]
let someFunction() = 42
sınıf
[<MyCustomAttributeThatWorksOnClasses>]
type MyClass(myValue: int) =
    member _.MyValue = myValue
Yapı
[<MyCustomAttributeThatWorksOnStructs>]
[<Struct>]
type MyStruct(myValue: int) =
    member _.MyValue = myValue
arayüz
[<MyCustomAttributeThatWorksOnInterfaces>]
type MyInterface =
    abstract member Prop: string
enum
[<MyCustomAttributeThatWorksOnEnums>]
type Color =
    | Red = 0
    | Green = 1
    | Blue = 2
Oluşturucu
type MyClass(myValue: int) =
    member _.MyValue = myValue

    [<MyCustomAttributeThatWorksOnCtors>]
    new () = MyClass 42
dönmek
let function1 x : [<return: MyCustomAttributeThatWorksOnReturns>] int = x + 1
alan
[<DefaultValue>] val mutable x: int
mülk
[<Obsolete>] this.MyProperty = x
param
member this.MyMethod([<Out>] x : ref<int>) = x := 10
tür
[<type: StructLayout(LayoutKind.Sequential)>]
type MyStruct =
  struct
    val x : byte
    val y : int
  end

Ayrıca bkz.