حقول واضحة: قيمة كلمة أساسية (F#)

valالكلمة الأساسية هو المستخدمة لتعريف حقل في نوع فئة أو بنية بدون تهيئة it. حقول التي تم تعريفها في هذه الطريقة تسمى حقول واضحة .

[ static ] val [ mutable ] [ access-modifier ] field-name : type-name

ملاحظات

بالطريقة المعتادة لتعريف حقول في نوع فئة أو بنية هو لاستخدام letربط. However, let bindings must be initialized كـ part of the فئة الدالة الإنشائية, which ليس دوماً possible, necessary, أو desirable. You can استخدم the val كلمة أساسية when you want a حقل that هو uninitialized.

Explicit حقول can be ثابت أو non-ثابت. Theaccess-modifiercan bepublic,private, أوinternal. بواسطة الافتراضي, explicit حقول are public. This differs من let bindings في فئات, which are دوماً private.

The DefaultValue سمة هو مطلوب تشغيل explicit حقول في فئة أنواع that have a primary الدالة الإنشائية. This سمة specifies that the حقل هو initialized إلى zero. The نوع of the حقل must دعم zero-تهيئة. A نوع supports zero-تهيئة if it هو واحد of the following:

  • A primitive نوع that has a zero القيمة.

  • A نوع that supports a null القيمة, either كـ a عادي القيمة, كـ an abnormal القيمة, أو كـ a representation of a القيمة. هذا يتضمن فئات، والمجموعات عن، السجلات، والدالات، والواجهات، ومرجع.NET أنواع، unit، وتوحيد discriminated أنواع.

  • نوع القيمة.NET.

  • بنية يعتمد حقول ذات الجميع الافتراضي القيمة صفر.

يلي تعليمات برمجية يظهر استخدام حقول واضحة والمقارنة، letربط في فئة يحتوي على الدالة الإنشائية الأساسي. لاحظ أن let-مرتبط بحقل myInt1هو خاص. عند let-مرتبط بحقل myInt1هو المشار إليه من أسلوب عضو، معرّف ذاتيا thisهو غير مطلوب. ولكن عندما يتم الرجوع إلى في حقول واضحة myInt2و myString، معرّف ذاتيا هو المطلوبة.

type MyType() =
    let mutable myInt1 = 10
    [<DefaultValue>] val mutable myInt2 : int
    [<DefaultValue>] val mutable myString : string
    member this.SetValsAndPrint( i: int, str: string) =
       myInt1 <- i
       this.myInt2 <- i + 1
       this.myString <- str
       printfn "%d %d %s" myInt1 (this.myInt2) (this.myString)

let myObject = new MyType()
myObject.SetValsAndPrint(11, "abc")
// The following line is not allowed because let bindings are private.
// myObject.myInt1 <- 20
myObject.myInt2 <- 30
myObject.myString <- "def"

printfn "%d %s" (myObject.myInt2) (myObject.myString)

الإخراج هو كما يلي:

11 12 abc

30 def

يلي تعليمات برمجية يعرض استخدام حقول واضحة في فئة يحتوي على الدالة الإنشائية أساسي. في ترتيب هو الحالة DefaultValueسمة هو غير مطلوب، ولكن يجب أن تتم تهيئة الجميع حقول في المنشئات التي تم تعريفها لنوع.

type MyClass =
    val a : int
    val b : int
    // The following version of the constructor is an error
    // because b is not initialized.
    // new (a0, b0) = { a = a0; }
    // The following version is acceptable because all fields are initialized.
    new(a0, b0) = { a = a0; b = b0; }

let myClassObj = new MyClass(35, 22)
printfn "%d %d" (myClassObj.a) (myClassObj.b)

المخرج هو 35 22.

يلي تعليمات برمجية يظهر استخدام حقول واضحة في بنية. نظراً لأن بنية هو نوع القيمة، فإنه يملك تلقائياً الدالة الإنشائية افتراضي الذي يقوم بتعيين قيم حقول الخاصة به إلى الصفر. ولذلك، DefaultValueسمة هو غير مطلوب.

type MyStruct =
    struct
        val mutable myInt : int
        val mutable myString : string
    end

let mutable myStructObj = new MyStruct()
myStructObj.myInt <- 11
myStructObj.myString <- "xyz"

printfn "%d %s" (myStructObj.myInt) (myStructObj.myString)

المخرج هو 11 xyz.

لا يقصد من حقول واضحة لروتين استخدم. بشكل عام، كلما أمكن ينبغي عليك استخدم letربط في فئة بدلاً من عنصر حقل صريحة. حقول واضحة مفيدة في بعض السيناريوهات إمكانية التشغيل التفاعلي، على سبيل المثال إذا كنت بحاجة إلى تعريف بنية التي سيتم استخدامها في نظام أساسي استدعاء استدعاء إلى واجهة برمجة تطبيقات أصلي، أو في وحدات السيناريو إمكانية التشغيل التفاعلي COM. لمزيد من المعلومات، راجع الخارجية دالات (F#). موقف آخر فيه أحد الحقول واضحة قد تكون ضرورية هو عند العمل مع F# رمز مولد الذي emits فئات دون على الدالة الإنشائية أساسي. حقول الصريحة أيضا مفيدة للمتغيرات الثابتة مؤشر ترابط أو بنيات مماثلة. لمزيد من المعلومات، راجع ThreadStaticAttribute.

راجع أيضًا:

المرجع

ترك للربط في فئات (F#)

المبادئ

الأعضاء (F#)