سؤال

أنا PHP مبرمج ويب الذي تحاول تعلم C#.

أود أن أعرف لماذا C# يتطلب مني أن تحدد نوع البيانات عند إنشاء متغير.

Class classInstance = new Class();

لماذا نحن بحاجة إلى معرفة نوع البيانات قبل فئة سبيل المثال ؟

هل كانت مفيدة؟

المحلول

كما قال آخرون, C# هو ثابت/كتابة بشدة.ولكن لا تأخذ المسألة أكثر من أن تكون "لماذا تريد C# أن تكون ثابتة/كتابة بشدة مثل هذا ؟ ما هي مزايا هذا يكون أكثر ديناميكية اللغات؟"

مع هذا في الاعتبار, هناك الكثير من الأسباب الجيدة:

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

    وربما هذا هو السبب ، على سبيل المثال ، مايكروسوفت نمط المبادئ التوجيهية الموصى بها من هذا VB6 المبرمجين وضع نوع البادئة مع أسماء المتغيرات ، ولكن هذا VB.Net المبرمجين لا.

  • الأداء هذا هو أضعف السبب ، ولكن في وقت متأخر ملزم/بطة الكتابة يمكن أن يكون أبطأ.في النهاية متغير يشير إلى الذاكرة منظم بطريقة معينة.بدون قوية أنواع البرنامج سوف تضطر إلى القيام به اضافية نوع التحقق أو التحويل وراء الكواليس في وقت التشغيل كما يمكنك استخدام الذاكرة منظم طريقة واحدة جسديا كما لو كان منظم بطريقة أخرى منطقيا.

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

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

  • أفضل أدوات ديف إذا كان الخاص بك IDE يعرف ما هو نوع متغير من المتوقع أن يكون, أنها يمكن أن تعطي لك مساعدة إضافية حول ما هي أنواع الأشياء التي المتغير يمكن القيام به.هذا هو أصعب بكثير IDE أن تفعل إذا كان الاستدلال على نوع بالنسبة لك.و إذا كان يمكنك الحصول على مزيد من المساعدة مع التفاصيل التافهة من API من IDE, ثم أنت كمطور سوف تكون قادرة على الحصول على رأسك حول أكبر ثراء API بشكل أسرع.

أو ربما كنت أتساءل لماذا يجب تحديد اسم الفئة مرتين لنفس المتغير على نفس الخط ؟ الجواب ذو شقين:

  1. في كثير من الأحيان لا.في C# 3.0 وما بعدها يمكنك استخدام var الكلمة بدلا من اسم النوع في كثير من الحالات.المتغيرات التي تم إنشاؤها بهذه الطريقة لا تزال كتابتها بشكل ثابت ، ولكن اكتب الآن الاستدلال لك من قبل المترجم.
  2. بفضل الميراث واجهات بعض الأحيان نوع على الجانب الأيمن لا يطابق نوع على الجانب الأيمن.

نصائح أخرى

انها ببساطة كيف اللغة صمم.C# هو ج-نمط اللغة يلي في نمط وجود أنواع على اليسار.

في C# 3.0 و حتى يمكنك الحصول على نوع من حول هذا في كثير من الحالات مع المحلية نوع الاستدلال.

var variable = new SomeClass();

ولكن في نفس الوقت يمكن القول أيضا أن كنت لا تزال إعلان نوع على LHS.فقط ان كنت تريد مترجم لاختيار لك.

تحرير

يرجى قراءة هذا في سياق المستخدمين السؤال الأصلي

لماذا نحن بحاجة إلى [اسم الفئة] قبل متغير الاسم ؟

أردت أن أعلق على عدة إجابات أخرى في هذا الموضوع.الكثير من الناس إعطاء "C# هو ثابت من نوع" كإجابة.في حين أن العبارة صحيحة (C# هو ثابت كتابة) ، فإنه يكاد لا علاقة لها تماما على السؤال.كتابة ثابتة لا يستلزم نوع اسم يجري على يسار اسم المتغير.متأكد من أنها يمكن أن تساعد ولكن هذا هو مصمم لغة الاختيار ليس سمة ضرورية من ساكنة تكتب اللغات.

هذه بسهولة يمكن اثباتها من خلال النظر في غيرها من اللغات كتابتها بشكل ثابت مثل F#.أنواع F# تظهر على يمين اسم متغير و في كثير من الأحيان يمكن حذفها تماما.هناك أيضا عدة أمثلة مضادة.PowerShell على سبيل المثال هو دينامية للغاية و يضع كل نوع ، إذا اشتملت على اليسار.

واحدة من الأسباب الرئيسية هو أنه يمكنك تحديد أنواع مختلفة طالما نوع على الجانب الأيسر من التكليف هو نوع الأم من النوع الذي على اليسار (أو واجهة التي يتم تنفيذها في هذا النوع).

على سبيل المثال وبالنظر إلى الأنواع التالية:

class Foo { }
class Bar : Foo { }
interface IBaz { }
class Baz : IBaz { }

C# يسمح لك أن تفعل هذا:

Foo f = new Bar();
IBaz b = new Baz();

نعم ، في معظم الحالات مترجم يمكن أن نستنتج نوع المتغير من المهمة (مثل مع var الكلمة) ولكن لا لسبب لدي هو مبين أعلاه.

تحرير: نقطة نظام - حين C# هو كتابة بشدة التمييز المهم (قدر هذا النقاش هو المعني) هو في الواقع أيضا ثابت كتبته اللغة.وبعبارة أخرى C# compiler لا ثابت نوع التحقق في تجميع الوقت.

وC # هو كتبته بشكل ثابت و <لأ href = "HTTP: / /en.wikipedia.org/wiki/Strongly-typed_programming_language "يختلط =" نوفولو noreferrer "> كتابة بشدة اللغات مثل C أو C ++. في اللغات التالية يجب أن يتم تعريف كل المتغيرات لتكون من نوع معين.

وفي نهاية المطاف لأن أندرس هيلسبرغ قال ذلك ...

وتحتاج [اسم الفئة] في الجبهة لأن هناك العديد من الحالات التي يكون فيها الأول [اسم الفئة] يختلف عن الثاني، مثل:

 IMyCoolInterface obj = new MyInterfaceImplementer();
 MyBaseType obj2 = new MySubTypeOfBaseType();

وغيرها. يمكنك أيضا استخدام كلمة "فار" إذا كنت لا ترغب في تحديد نوع explicitely.

لماذا نحن بحاجة إلى معرفة نوع البيانات قبل فئة سبيل المثال ؟

أنت لا! تقرأ من اليمين إلى اليسار. إنشاء متغير ثم تخزينها في آمنة متغير حتى تعرف ما نوع هذا المتغير هو لاستخدامها في وقت لاحق.

ولنتأمل المقتطف التالي سيكون كابوس التصحيح إذا كنت لم تتلقى أخطاء حتى وقت التشغيل.

 void FunctionCalledVeryUnfrequently()
 {
   ClassA a = new ClassA();
   ClassB b = new ClassB();
   ClassA a2 = new ClassB(); //COMPILER ERROR(thank god)

   //100 lines of code

   DoStuffWithA(a);
   DoStuffWithA(b);      //COMPILER ERROR(thank god)
   DoStuffWithA(a2);
 }

عندما you'r التفكير يمكنك استبدال فئة جديدة() مع رقم أو سلسلة و جملة جعل أكثر من معنى.المثال التالي قد يكون قليلا مطول ولكن قد تساعد على فهم السبب في أنه صمم على ما هو عليه.

   string s = "abc";
   string s2 = new string(new char[]{'a', 'b', 'c'});
   //Does exactly the same thing

   DoStuffWithAString("abc");
   DoStuffWithAString(new string(new char[]{'a', 'b', 'c'}));
   //Does exactly the same thing

وC #، كما أشار آخرون، هي لغة بقوة، كتبته بشكل ثابت.

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

وأخيرا، وليس لطيف، C # (والعديد من اللغات الأخرى) لا يملك نفسه مثير للسخرية "تحويل أي شيء إلى أي شيء، حتى عندما لا معنى له" العقلية التي PHP يفعل، والتي وبكل صراحة يمكن أن رحلة لك يصل أكثر من مرة يساعد على ذلك.

ولأن C # هي لغة كتابة بشدة

وج # هي لغة كتابة بشدة، مثل ج ++ أو جافا. وبالتالي فإنه يحتاج إلى معرفة نوع المتغير. يمكنك يتلاعب عليه قليلا في ج # 3.0 عن طريق الكلمة فار. التي تسمح للمترجم استنتاج نوع.

وهذا هو الفرق بين اللغة المكتوبة بشدة وكتبته ضعيفة. C # (وC، C ++، جافا، معظم لغات أكثر قوة) يتم كتابتها بشدة لذلك يجب أن يعلن نوع متغير.

عند نحدد المتغيرات لعقد البيانات التي لدينا لتحديد نوع البيانات التي هذه المتغيرات سوف تعقد. المترجم ثم يتحقق أن ما نقوم به مع البيانات المنطقي لذلك، أي يتبع القواعد. ونحن لا يمكن للنص سبيل المثال متجر في عدد - المترجم لن تسمح بذلك

int a = "fred"; // Not allowed. Cannot implicitly convert 'string' to 'int' 

والمتغير وغير من نوع int، وأسند لها قيمة "فريد" وهو سلسلة نصية فواصل rules- المترجم غير قادر على القيام بأي نوع من تحويل هذه السلسلة.

في C # 3.0، يمكنك استخدام "فار" الكلمة - وهذا يستخدم ثابت نوع الاستدلال للعمل على ما نوع المتغير في وقت الترجمة

var foo = new ClassName();

والمتغير 'فو' سيكون من نوع 'اسم_الفئة "منذ ذلك الحين.

واحد من الأشياء التي لم يرد ذكرها هي أن C # هو CLS (اللغة المشتركة مواصفات) لغة متوافقة. هذا هو مجموعة من القواعد التي لغة. NET يجب أن تلتزم لكي تكون interopable مع لغات NET الأخرى.

وهكذا حقا C # هو مجرد الحفاظ على هذه القواعد. على حد تعبير هذا المقال MSDN :

<اقتباس فقرة>   

ووCLS يساعد على تعزيز وضمان   العمل المشترك من خلال تحديد اللغة   مجموعة من الميزات التي يمكن للمطورين   الاعتماد على أن تكون متاحة في مجموعة واسعة   مجموعة متنوعة من اللغات. وCLS أيضا   يحدد متطلبات CLS   الامتثال؛ هذه تساعدك على تحديد   ما إذا كان رمز المدارة يتوافق مع   وCLS وإلى أي مدى معين   تدعم أداة تطوير   التعليمات البرمجية المدارة التي تستخدم CLS الميزات.

     

إذا عنصر يستخدم الوحيد CLS   الميزات في API أنه تعرض ل   رمز آخر (بما في ذلك المشتقة   فئات)، ويضمن العنصر   لتكون في متناول من أي برمجة   اللغة التي تدعم CLS.   المكونات التي تلتزم CLS   القواعد واستخدام فقط ميزات   المدرجة في CLS ويقال ان   مكونات CLS المتوافقة

وجزء من CLS هو CTS في المشترك نوع النظام .

وإذا كان هذا لا يكفي المختصرات بالنسبة لك، ثم هناك طن أكثر في. NET مثل CLI، ILASM / MSIL، CLR، BCL، FCL،

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

يساعد

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

ولم أتبين إذا ذكرت ذلك حتى الآن أم لا، ولكن C # 4.0 يدخل فحص ديناميكية VIA الكلمة dynamic. على الرغم من أنني متأكد من أنك تريد أن تجنب ذلك عندما انها ليست ضرورية.

<اقتباس فقرة>   

لماذا C # يتطلب مني أن تحدد نوع البيانات عند إنشاء متغير.

     

لماذا نحن بحاجة إلى معرفة نوع البيانات قبل مثيل فئة؟

وأعتقد أن الشيء الوحيد الذي معظم الإجابات لم المشار إليها هو حقيقة أن C # كان <ط> أصلا يعني والتي صممت لتكون "نجح"، "آمنة" لغة من بين أمور أخرى، والكثير من تلك الأهداف وصلت الى طريق ثابت / تجميع وقت التحقق. معرفة نوع البيانات متغير يجعل صراحة هذه المشكلة أسهل بكثير لحلها. وهذا يعني أن واحدا يمكن أن تجعل العديد من التقييمات الآلي (C # المترجم، لا JIT) عن الأخطاء المحتملة / سلوك غير مرغوب فيه دون السماح تنفيذ أي وقت مضى.

وهذا التحقق كأثر جانبي يمنحك أيضا قراءة أفضل، وأدوات ديف والاستقرار الخ لأنه إذا خوارزمية الآلي يمكن أن نفهم بشكل أفضل ما ستفعل رمز عند تشغيله في الواقع، حتى يمكن لكم:)

وكتابتها بشكل ثابت يعني أن مترجم يمكن أن تؤدي إلى نوع من الاختبارات في وقت وترجمة لا في وقت التشغيل. كل متغير هو من معين أو قوي نوع في نوع ثابت. وبقوة كتبته بالتأكيد بقوة C #.

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