سؤال

ال var الكلمة الرئيسية تتخلص من الحاجة إلى إعلان نوع صريح وقرأت باهتمام لذلك مناقشة عندما يكون ذلك مناسبا.

لقد قرأت أيضًا عن (ولكن لم تستخدم) بوو الذي يبدو أنه يأخذ الأمور خطوة إلى الأمام من خلال صنعها اختياري لإعلان متغير محلي. مع بوو ، يمكن ضمني كل من النوع والإعلان.

ما الذي يقودني إلى التساؤل ، لماذا يزعج مصممي اللغة C# تضمين كلمة رئيسية VAR على الإطلاق؟

تحديث: نعم ، تدعم VAR أنواعًا مجهولة ، لكن الأنواع المجهولة في حد ذاتها لا تتطلب الكلمة الرئيسية VAR ...

var anon = new { Name = "Terry", Age = 34 };

عكس

anon = new { Name = "Terry", Age = 34 };
هل كانت مفيدة؟

المحلول

تحديث: هناك سؤالان ذوو الصلة هنا ، في الواقع: 1. لماذا يجب علي إعلان المتغيرات على الإطلاق؟ 2. ما فائدة "var" بلغة تجعلك تعلن المتغيرات؟

الإجابات على (1) عديدة ، ويمكن العثور عليها في مكان آخر لهذا السؤال. إجابتي على (2) أدناه:

كما قال المعلقون الآخرون ، يستخدم LINQ هذا لأنواعه المجهولة. ومع ذلك ، فإن LINQ هو في الواقع مثيل لمشكلة أكثر عمومية حيث يكون نوع الجانب الأيمن للتعبير إما غير معروف للمبرمج ، أو يكون مطولاً للغاية. انصح:

SomeGeneric<VeryLongTypename<NestedTypename>> thing = new   
SomeGeneric<VeryLongTypename<NestedTypename>>();

مطول ومعرض للخطأ ، أليس كذلك؟ حتى الآن يسمحون لك بذلك:

var thing = new SomeGeneric<VeryLongTypename<NestedTypename>>();

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

نصائح أخرى

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

name = "fred";
   ...
Name = "barney"; // whoops! we meant to reuse name

أنا أفهم الحاجة إلى var ويخدمها الغرض. عدم وجود كلمة رئيسية وتحديد المتغيرات على الطيران بدون نوع أمر مخيف. يضر الرجل التالي الذي يتعين عليه الحفاظ على الكود الخاص بك أو نفسك إذا كنت بحاجة إلى إعادة صياغة الكود الذي لم تلمسه أكثر من عام. لست متأكدًا من أن هذا الباب الذي يجب فتحه في C# وآمل أن لا يكون VAR قد تسبب بالفعل مشكلات في قابلية القراءة عند الاستخدام عندما لا يكون ذلك ضروريًا.

تقريبا كل .NET 3.5 مثال أراه مؤخرًا لديه جميع المتغيرات المحددة مع VAR.

الجدال الذي أجده هو أنه يضحى حقًا بقدرة على توفير ضغطات المفاتيح عند استخدامه. فمثلا:

// What myVar is, is obvious
SomeObject myVar = new SomeObject();

// What myVar is, is obvious here as well
var myVar = new SomeObject();

المشكلة التي أراها هي أن الناس يستخدمونها في كل مكان ... على سبيل المثال:

// WTF is var without really knowing what GetData() returns?
// Now the var shortcut is making me look somewhere else when this should
// just be readable!
var myVar = GetData();

// If the developer would have just done it explicitly it would actually
// be easily readable.
SomeObject myVar = GetData();

لذا فإن الجدال التالي سيكون ، فقط اسم الوظيفة بشكل أفضل ...

var weight = GetExactWeightOfTheBrownYakInKilograms();

ما زلت لا أعرف ما الذي يعود. هل هو int ، عشرية ، تعويم ، كائن الوزن ، ماذا؟ لا يزال يتعين علي إضاعة الوقت في البحث عن ذلك ... أحتاج إلى عكاز Intellisense لإنقاذ اليوم من برمجة كسول. ربما تضمين نوع الإرجاع في اسم الوظيفة. فكرة جيدة ، الآن أن استخدام VAR لم ينقذنا شيئًا سوى جعل جميع وظائفي لها أسماء طويلة حقيقية.

أعتقد أن الناس قد انتهوا للتو من استخدام VAR ويؤدي إلى برمجة كسول مما يؤدي بدوره إلى صعوبة قراءة التعليمات البرمجية. في كل مرة تكتب فيها الكلمة الرئيسية VAR ، يجب أن يكون لديك سبب وجيه لاستخدامها بدلاً من أن تكون صريحًا.

هذا أمر شخصي بعض الشيء ، لكنني أعتقد أن تصميم C# 3.0 للحصول على الكلمة الرئيسية "VAR" للمتغيرات المكتوبة ضمنيًا بدلاً من عدم وجود كلمة رئيسية يجعل الكود أكثر قابلية للقراءة. على سبيل المثال ، تكون كتلة الكود الأول أدناه أكثر قابلية للقراءة من الثانية:

من الواضح حيث يتم الإعلان عن المتغير:

var myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;

ليس من الواضح أين يتم الإعلان عن المتغير:

myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;

هذه أمثلة مفرطة في التبسيط. أعتقد أنه يمكنك رؤية أين يذهب هذا. في المواقف المعقدة ، قد يكون من الجيد أن تكون قادرًا على العثور على المكان الذي يتم فيه تعريف المتغير فعليًا.

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

على سبيل المثال ، في قسم التحديث من سؤالك ، سألت حول هذا المقتطف:

anon = new { Name = "Terry", Age = 34 };

المشكلة في السماح بذلك بهذه الطريقة هي أنها تحول أي شيء على الجانب الأيسر من أي مهمة حيث لم يكن الاسم موجودًا سابقًا في إعلان متغير ، حتى لو كان خطأً مطبعيًا حقًا. إذا كنت في وقت لاحق في البرنامج ، فأنت تقوم بتعيين شيء آخر إلى Anon ، ثم أكثر على الإشارة إلى القيمة الجديدة ، ولكن كان البيان الأوسط مطبعيًا ، فلديك مشكلة لن تظهر حتى وقت التشغيل.

ردك هو أن بوو يفعل ذلك ، لذلك يجب أن يكون على ما يرام أو على الأقل ممكن. لكن هذا رنجة حمراء. نحن نتحدث عن C#، وليس بوو. أحد أغراض C# هو أن يكون لديك لغة حيث يمكن للمترجم أن يمسك أكبر عدد ممكن من الأخطاء. Boo يريد أن يفعل ذلك أيضًا ، لكنه يريد أيضًا أن يكون أكثر مثل Python. لذلك يضحى بعض (ليس كل شيء) من سلامة وقت الترجمة C#في مقابل بناء جملة تشبه الثعبان.

إخلاء المسئولية: أمثلةي هي جافا لأن هذا ما أعرفه ، لكن المفاهيم يجب أن تكون متطابقة.

لقد صوتت للإجابة التي أشعر أنها حرجة (من السهل جدًا إنشاء متغير جديد عن طريق الخطأ).

bill=5;
bi11=bill+5

ما هي قيمة بيل؟

ومع ذلك ، أجدها مزعجة إلى حد ما في بعض الأحيان للكتابة:

DataOutputStream ds=new DataOutputStream();

يبدو زائدة عن الحاجة ، ولكن بصراحة لا يوجد شيء خاطئ حقًا. لم يعد الأمر يأخذك بعد الآن لكتابته مرتين ، وهو مفيد للغاية. ما يستغرق وقتًا عندما يكون لديك أسئلة-عندما لا تكون متأكدًا من كيفية استخدام بعض API. إذا كان الأمر يزعجك حقًا في كتابة هذا الإعلان عن النوع مرتين ، فلماذا تضيع وقتك هنا؟ منذ أن بدأت في قراءة هذا ، كان بإمكانك كتابة 30 أو 40 إعلانًا ، وهو ما يكفي لكل إعلان ستحتاجه خلال الأسبوعين المقبلين.

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

شيء آخر ، في معظم الأحيان لا ينبغي أن يكون الكود مثل مثالي أعلاه. ما يجب أن تفعله هو:

DataOutput ds=new DataOutputStream();

هذا يخفي على الفور حقيقة أنك تستخدم فئة ملموسة في قالب. يجب أن يكون هذا القالب قادرًا على القيام بجميع العمليات التي تحتاجها في فصلك. في وقت لاحق إذا كنت ترغب في استبدال DS بنوع آخر من دفق الإخراج ، فما عليك سوى تغيير هذا السطر المفرد. إذا كنت تستخدم الميزات غير المتاحة لـ DataOutput من خلال الإلقاء على DataOutputStream ، فسيقوم المحرر بتعرفها بسهولة وإعلامك بذلك.

لأنواع مجهولة ، والتي من بين أشياء أخرى تدعم LINQ.

http://www.blackwasp.co.uk/csharpanontypes.aspx

I believe that var (and several other new keywords) were added specifically to support Linq.

var is the keyword used to create an anonymous type - see http://msdn.microsoft.com/en-us/library/bb397696.aspx

Anonymous types can be used in other places than Linq.

var is exceedingy useful for Linq. In fact, according to one expert author, "Without ‘var’, LINQ gets too painful to use."

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top