تنسيق التعليمات البرمجية الإرشادات (F#)
يلخص هذا الموضوع إرشادات مسافة بادئة للرمز ب #. لأن اللغة F# هو الهامة فواصل الأسطر والمسافة البادئة، هو ليس فقط إمكانية قراءة هو sue aesthetic هو sue، أو كتابة تعليمات برمجية المقاييس هو sue لتنسيق تعليمات برمجية الخاصة بك بشكل صحيح. يجب تنسيق تعليمات برمجية الخاصة بك بشكل صحيح حتى إلى يحول برمجياً بشكل صحيح.
قواعد عامة للمسافة البادئة
عند مسافة بادئة هو المطلوبة، يجب عليك استخدام المسافات، وعلامات التبويب لا. مسافة واحدة على الأقل هو المطلوبة. يمكن للمؤسسة إنشاء مقاييس ترميز لتحديد عدد المسافات لاستخدامه للمسافة البادئة؛ مسافات ثلاثة أو الرابع مسافة بادئة في كل المستوى بحيث تظهر المسافات البادئة المعتادة. You can تكوين Visual Studio إلى مطابقة your المؤسسة's مسافة بادئة standards بواسطة changing the خيارات في the خيارات حوار صندوق, which هو متوفر من the أدوات قائمة. في the محرر نص عقدة, توسيع F# و then انقر علامات التبويب. For a وصف of the متوفر خيارات, see علامات التبويب، كافة اللغات محرر نص مربع الحوار خيارات.
في عام, when the compiler parses your تعليمات برمجية, it maintains an internal مكدس that indicates the الحالي المستوى of nesting. When تعليمات برمجية هو indented, a جديد المستوى of nesting هو تاريخ الإنشاء, أو pushed onto this internal مكدس. When a construct ends, the المستوى هو popped. مسافة بادئة هو واحد way إلى signal the إنهاء of a المستوى و pop the internal مكدس, but certain رموز مميزة also cause the المستوى إلى be popped, such كـ the end كلمة أساسية, أو a closing brace أو parenthesis.
تعليمات برمجية في a multiline construct, such كـ a نوع تعريف, دالة تعريف, try...with construct, و looping constructs, must be indented نسبي إلى the فتح خط of the construct. The أول indented خط establishes a عمود موضع for subsequent تعليمات برمجية في the same construct. The مسافة بادئة المستوى هو called a سياق. The عمود موضع sets a الحد الأدنى عمود, referred إلى كـ an offside خط, for subsequent lines of تعليمات برمجية that are في the same سياق. عند مصادفة سطر من تعليمات برمجية هو المسافة البادئة أصغر من من ذلك تأسيس عمود الموضع، يفترض المحول البرمجي انتهاء سياق وأنه الذي يتم الآن الترميز في المستوى التالي، في سياق السابق. offside هو يستخدم لوصف الشرط الذي يشغل سطر من تعليمات برمجية إنهاء بناء سبب ذلك هو لا توجد مسافة بادئة أقصى كافية. بمعنى آخر، تعليمات برمجية إلى يسار إلى خط offside هو offside. في تحريكها بشكل صحيح تعليمات برمجية، يمكنك الاستفادة من قاعدة offside إلى إنهاء بنيات delineate. إذا كنت تستخدم مسافة بادئة بشكل غير صحيح، يمكن أن يؤدي المترجم لإصدار تحذير شرط offside أو يمكن أن يؤدي إلى التفسير غير صحيح من تعليمات برمجية الخاصة بك.
يتم تحديد خطوط offside كـ يتبع.
=الرمز المميز المقترن letيقدم لخط offside في عمود من الرمز المميز أول بعد =تسجيل.
في if...then...elseتعبير، موضع العمود الرمز المميز أول بعد thenالكلمة الأساسية أو elseيقدم الكلمة الأساسية على خط offside.
في try...withتعبير، الرمز المميز أول بعد tryيقدم على خط offside.
في matchتعبير، الرمز المميز أول بعد withوالرمز المميز أول بعد كل ->تقديم خطوط offside.
الرمز المميز أول بعد withفي نوع ملحق يقدم على خط offside.
الرمز المميز أول بعد قوس الفتح أو أقواس، أو بعد beginكلمة أساسية، يقدم على خط offside.
أول حرف في الكلمات الأساسية let، if، و moduleتقديم خطوط offside.
يلي تعليمات برمجية توضح الأمثلة قواعد المسافات البادئة. هنا، عبارات طباعة تعتمد تشغيل مسافة بادئة إلى إقرانها بسياق مناسب. كل مرة يتم فيها نقل مسافة بادئة، هو سياق تظهر و يعود إلى سياق السابق. لذلك، مسافة هو المطبوعة في إنهاء كل تكرار؛ "تم!" هو فقط طباعته مرة واحدة لأنه establهوhes مسافة بادئة offside أنه هو ليس جزء من الحلقة. طباعة السلسلة "سياق المستوى العلوي" هو ليس جزء من دالة. ولذلك، هو المطبوعة الأولى، أثناء تهيئة ثابتة، وذلك قبل دالة هو المسمى.
let printList list1 =
for elem in list1 do
if elem > 0 then
printf "%d" elem
elif elem = 0 then
printf "Zero"
else
printf "(Negative number)"
printf " "
printfn "Done!"
printfn "Top-level context."
printList [-1;0;1;2;3]
الإخراج هو كما يلي.
Top-level context
(Negative number) Zero 1 2 3 Done!
عند فصل طويل خط s، المتابعة من خط يجب أن تكون المسافة البادئة farther من بناء المضمنة. على سبيل المثال، وسائط دالة يجب أن يتم تحريكها farther من الحرف أول من اسم دالة، كما هو موضح فيما يلي تعليمات برمجية.
let myFunction1 a b = a + b
let myFunction2(a, b) = a + b
let someFunction param1 param2 =
let result = myFunction1 param1
param2
result * 100
let someOtherFunction param1 param2 =
let result = myFunction2(param1,
param2)
result * 100
هناك استثناءات إلى هذه القواعد، كما هو موضح في مقطع التالي.
مسافة بادئة في الوحدات النمطية
تعليمات برمجية فيها في الوحدة نمطية محلية يجب أن يتم ضبط نسبة إلى وحدة نمطية?، ولكن تعليمات برمجية في الوحدة نمطية للمستوى أعلى ليس بالضرورة أن يكون لها نفس المسافة البادئة. ليس لديك عناصر مساحة أسماء المصادر إلى يمكن تحريكها إلى مستوى أدنى.
توضح الأمثلة تعليمات برمجية التالية هذا.
// Program1.fs
// A is a top-level module.
module A
let function1 a b = a - b * b
// Program2.fs
// A1 and A2 are local modules.
module A1 =
let function1 a b = a*a + b*b
module A2 =
let function2 a b = a*a - b*b
لمزيد من المعلومات، راجع الوحدات النمطية (F#).
استثناءات إلى القواعد أساسى مسافة بادئة
القاعدة عام، كما هو موضح في القسم السابق، أن أن تعليمات برمجية في بنيات متعدد الأسطر يجب أن يتم تحريكها النسبي إلى مسافة بادئة السطر أول من بناء، ونهاية بناء يحدده عند حدوث offside السطر أول. استثناء للقاعدة حول متى تنتهي سياقات هو ذلك بعض بناء، مثل try...withالتعبير، if...then...else التعبير، استخدم andيكون بناء الجملة للتصريح بشكل دالات متداخلة أو أنواع متعددة الأجزاء. المسافة البادئة التي في وقت لاحق الأجزاء، مثل كـ thenو elseفي if...then...elseالتعبير، في نفس المستوى كـ الرمز المميز الذي يبدأ التعبير، ولكن بدلاً من الإشارة إلى طرف إلى سياق، تمثل الجزء التالي من نفس سياق. ولذلك، if...then...elseيمكن كتابة تعبير في ما يلي تعليمات برمجية المثال.
let abs1 x =
if (x >= 0)
then
x
else
-x
استثناء إلى يتم تطبيق القاعدة offside فقط إلى thenو elseالكلمات الأساسية. لذلك، على الرغم من أنه هو ليس خطأ لوضع مسافة بادئة thenو elseعلاوة على ذلك، فشل في إضافة مسافة بادئة سطور تعليمات برمجية في thenتنتج حظر التحذير. يتم توضيح ذلك في سطور تعليمات برمجية التالية.
// The following code does not produce a warning.
let abs2 x =
if (x >= 0)
then
x
else
-x
// The following code is not indented properly and produces a warning.
let abs3 x =
if (x >= 0)
then
x
else
-x
للتعليمات البرمجية في elseحظر، قاعدة إضافى خاص بتطبيق. The تحذير في the السابق مثال occurs فقط تشغيل the تعليمات برمجية في the then حظر, not تشغيل the تعليمات برمجية في the else حظر. This allows you إلى write تعليمات برمجية that checks for متنوع conditions at the beginning of a دالة without forcing the rest of the تعليمات برمجية for the دالة, which might be في an else حظر, إلى be indented. Thus, you can write the following without producing a تحذير.
let abs4 x =
if (x >= 0) then x else
-x
Another استثناء إلى the قاعدة that contexts إنهاء when a خط ليس indented كـ far كـ a السابق خط هو for infix عوامل تشغيل, such كـ + و |>. Lines that يبدأ مع infix عوامل تشغيل are permitted إلى begin (1 + oplength) أعمدة قبل the عادي موضع without triggering an إنهاء إلى the سياق, الموقع oplength هو the رقم of حرف/ حروف that make لأعلى the عامل. ويؤدي هذا إلى الرمز المميز أول بعد عامل التشغيل أن يتلاءم مع السابق خط.
على سبيل المثال، في التعليمة البرمجية التالية: +الرمز هو مسموح أن يكون المقصود عمودين أصغر من من السطر السابق.
let function1 arg1 arg2 arg3 arg4 =
arg1 + arg2
+ arg3 + arg4
على الرغم من مسافة بادئة increكـes عادة كـ يصبح أعلى المستوى التداخل، توجد بنيات متعددة حيث المحول البرمجي يسمح لك بإعادة تعيين مسافة بادئة إلى موضع أسفل عمود.
تكون بنية تسمح بإعادة تعيين موضع العمود يتم كـ التالي:
نصوص من الدالات المجهولة. في ما يلي تعليمات برمجية، يبدأ التعبير طباعة في موضع عمود هو أبعد إلى اليمين من funالكلمة الأساسية. ومع ذلك، لا يجب أن يبدأ الخط في عمود إلى يسار بداية المستوى مسافة بادئة السابق (الذي هو، إلى يسار Lفي List).
let printListWithOffset a list1 = List.iter (fun elem -> printfn "%d" (a + elem)) list1
بنيات محاطة بقوسين أو بواسطة beginو endفي thenأو elseحظر من if...then...elseتوفير تعبير، مسافة بادئة هو لم أصغر من موضع العمود ifالكلمة الأساسية. Th هو استثناء يسمح لنمط ترميز فيه parenthes فتح هو أو beginهو المستخدمة في إنهاء سطر بعد thenأو else.
النصوص الأساسية للوحدات النمطية، والفئات، والواجهات، و بنيات محددة بواسطة begin...end، {...}، class...end، أو interface...end. يسمح هذا لنمط فيه الفتح كلمة أساسية من نوع التعريف يمكن أن تكون تشغيل نفس السطر كاسم النوع دون فرض كامل النص الأساسي إلى farther من الفتح كلمة أساسية.
type IMyInterface = interface abstract Function1: int -> int end