সি # তে ভর কীওয়ার্ডের ব্যবহার


406

সি # 3 তে 'বর্ণ' কীওয়ার্ড ব্যবহারের বিষয়ে সহকর্মীদের সাথে আলোচনার পরে আমি ভেবেছিলাম যে ভের মাধ্যমে টাইপের অনুক্রমের উপযুক্ত ব্যবহার সম্পর্কে লোকের মতামত কী ছিল?

উদাহরণস্বরূপ আমি বরং প্রশ্নবিদ্ধ পরিস্থিতিতে অলসভাবে ব্যবহার করেছি, যেমন: -

foreach(var item in someList) { // ... } // Type of 'item' not clear.
var something = someObject.SomeProperty; // Type of 'something' not clear.
var something = someMethod(); // Type of 'something' not clear.

বর্ণের আরও বৈধ ব্যবহার নিম্নরূপ:

var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.

মজার বিষয় হল লিনকুই কিছুটা ধূসর অঞ্চল বলে মনে হচ্ছে, যেমন: -

var results = from r in dataContext.SomeTable
              select r; // Not *entirely clear* what results will be here.

এটি পরিষ্কার হয়ে গেছে যে ফলাফলগুলি কীভাবে হবে যা এটি এমন এক ধরণের যা আইয়ুনিউরেবল কার্যকর করে, তবে এটি সম্পূর্ণভাবে সুস্পষ্ট নয় যে একইভাবে কোনও নতুন অবজেক্টের ঘোষক ভ্যার।

এটি লিনকিউ অবজেক্টে যেমন আসে তখন এটি আরও খারাপ eg

var results = from item in someList
              where item != 3
              select item;

এটি সমকক্ষ পূর্বাচনের চেয়ে ভাল (কোনও তালিকায় ভের আইটেম) ... // ...} সমতুল্য।

এখানে ধরণের সুরক্ষা সম্পর্কে সত্যিকারের উদ্বেগ রয়েছে - উদাহরণস্বরূপ যদি আমরা সেই ক্যোয়ারির ফলাফলগুলি একটি ওভারলোডেড পদ্ধতিতে স্থাপন করি যেটি গ্রহণযোগ্য <int> এবং IEnumerable <ডাবল> কলকারী অজান্তেই ভুল টাইপের মধ্যে দিয়ে যেতে পারে।

var নেই শক্তিশালী টাইপিং কিছু যা যখন overloads গড় কম্পাইলার এরর জারি না করা যেতে পারে বিবর্ধিত করা হয় বজায় রাখা কিন্তু প্রশ্ন সত্যিই তা বিপদজনক জন্য টাইপ না অবিলম্বে সংজ্ঞা আপাত হতে হয়, যখন আপনি অনিচ্ছাকৃতভাবে একটি পদ্ধতি ভুল টাইপ পাস।


68
ভের ব্যবহার ঠিকঠাক, তবে "আমাকে টাইপটি বের করতে হবে না" এটির ব্যবহারের খুব খারাপ কারণ বলে মনে হচ্ছে ... টাইপটি কী তা আপনার জানা উচিত, টাইপ এড়াতে কেবল ভার একটি শর্টকাট is
থমাস লেভেস্ক

53
var i = 0;== ব্যর্থ! var c = new CrazyFrigginLongClassName();== জয়!
dotjoe

6
"ভার আমাকে ভিবি / ভিবিএ বৈকল্পিক ধরণের কথাও মনে করিয়ে দেয় It এর জায়গাও ছিল I আমি স্মরণ করি (বহু বছর আগে থেকে) এর ব্যবহারটি পছন্দসই চেয়ে কম ধরণের ছিল এবং এটি ছিল ক্ষুধার্ত উত্স।" <- এটি একটি বেইটিং প্রশ্ন হিসাবে দেখায় যেহেতু 'ভ' টাইপ সি # এর ভিবি / ভিবিএ বৈকল্পিক ধরণের সাথে কোনও সম্পর্ক নেই।
user7116

20
var readabilityBeDamned = true;
spoulson

9
এখানে বর্ণিত সমস্ত উদাহরণগুলির সাথে সমস্যাটি হ'ল আমরা কোডের একটি লাইনকে দেখছি। যখন আমি "ভার" ঘোষণার রেখার পরে লাইনটি দেখি, একের পর এক, এটি হাতছাড়া হয়ে যায়। পঠনযোগ্যতা বিষয়বস্তু, তবে আমি সম্মানজনকভাবে ব্যবহারের চেয়ে বিভিন্ন ধরণের অপব্যবহার দেখতে পাই।
jro

উত্তর:


293

আমি এখনও মনে করি varকিছু ক্ষেত্রে কোড আরও পাঠযোগ্য। যদি আমার কাছে একটি অর্ডার সম্পত্তি সহ গ্রাহক শ্রেণি থাকে এবং আমি এটি একটি ভেরিয়েবলকে অর্পণ করতে চাই, আমি কেবল এটি করব:

var orders = cust.Orders;

যদি Customer.Orders আমি পরোয়া করি না IEnumerable<Order>, ObservableCollection<Order>বা BindingList<Order>- সব আমি চাই এটা পুনরুক্তি উপর মেমরি সেই তালিকাটি রাখা বা পরে তার গণনা বা কিছু পেতে হয়।

উপরোক্ত ঘোষণার সাথে এর তুলনা করুন:

ObservableCollection<Order> orders = cust.Orders;

আমার কাছে, টাইপের নামটি কেবল গোলমাল। এবং যদি আমি ফিরে যেতে এবং ট্র্যাক নিচে Customer.Orders ধরণ পরিবর্তন করার সিদ্ধান্ত নেন (থেকে বলতে ObservableCollection<Order>করার জন্য IList<Order>) তারপর আমি ঘোষণা খুব পরিবর্তন করতে হবে - আমি যদি আমি প্রথম ব্যবহৃত Var চাই যা করতে হবে না জায়গা।


48
আমি কোড পড়ছি তখন আমার সামনে সুস্পষ্ট টাইপ থাকা পছন্দ করি। আমি কীভাবে জানতে পারি যে "কাস্টম.আর্ডার্স" কী ধরণের ছাড়া এখানে রয়েছে? হ্যাঁ, আমি এটির জন্য আমার মাউসটিকে ঘোরাতে পারি, তবে কেন আমার এটি করা উচিত? :)
জন ট্যাকাবুরি

77
তবে মুল বক্তব্যটি হ'ল সাধারণভাবে তাতে কিছু আসে যায় না। প্রদত্ত কাস্টম।আর্ডার এমন একটি জিনিস যা আপনি গণনা করতে পারেন (যেমন পূর্বের পূর্বেই) তবে তা প্রকারের তা বিবেচ্য নয়। অতিরিক্ত কোডটি কেবল উদ্দেশ্যটি পড়ার পথে পেয়ে যায়।
ম্যাট হ্যামিল্টন

67
তবে যদি আপনার কেবল সেই আবশ্যক প্রয়োজন O অর্ডারগুলি "এমন কিছু যা আপনি গণনা করতে পারেন" তবে এটি একটি অপ্রয়োজনীয় <অর্ডার> হিসাবে এই প্রয়োজনীয়তাটি পরিষ্কার এবং স্পষ্ট করে না? এটিকে ভ্যার হিসাবে ঘোষণা করার অর্থ আপনি কার্যকরভাবে কার্যকরভাবে হারাবেন।
গ্রাহামস

5
@ জোন এবং কীভাবে আইএনইউমারবাল অর্ডারস = কাস্টম? অর্ডার ফোরচ (অর্ডার অনুযায়ী ক্রম) একটি পার্থক্য আনবে? ইনিউনামেবলের একমাত্র কথাটি হ'ল আপনি এটিকে ভবিষ্যদ্বাণীতে রাখতে পারেন তবে আপনি ইতিমধ্যে জানতেন যে নীচের লাইনটি থেকে
রুন এফএস

18
"আইনিউমারেবলের একমাত্র কথা হ'ল আপনি এটিকে পূর্বাভাসে রাখতে পারেন" - এটি এই উদ্দেশ্যটিও প্রকাশ করে যে আপনি কেবলমাত্র করতে পারেন তা গণনা করা। ভের ব্যবহার করে কংক্রিট সংগ্রহের ধরণের পাবলিক সদস্যদের অ্যাক্সেস এবং ইন্টেলিজেন্স দেয়।
জো

167

আমি varব্যাপকভাবে ব্যবহার । সমালোচনা হয়েছে যে এটি কোডের পঠনযোগ্যতা হ্রাস করে, তবে এই দাবিকে সমর্থন করার পক্ষে কোনও যুক্তি নেই।

স্বীকার করা, এটির অর্থ হতে পারে যে আমরা কোন ধরণের সাথে আচরণ করছি তা পরিষ্কার নয়। তাতে কি? এটি আসলে একটি decoupled ডিজাইনের পয়েন্ট। ইন্টারফেসের সাথে ডিল করার সময়, আপনি ভেরিয়েবলের টাইপের বিষয়ে দৃ emp়রূপে আগ্রহী ননvarএটিকে আরও অনেকখানি এগিয়ে নিয়ে যায়, সত্য, তবে আমি মনে করি যে একটি পঠনযোগ্যতার দৃষ্টিকোণ থেকে তর্কটি একই রকম রয়েছে: প্রোগ্রামারকে আসলে ভেরিয়েবলের ধরণের প্রতি আগ্রহী হওয়া উচিত নয় বরং পরিবর্তে কী পরিবর্তন করা যায় তার প্রতি আগ্রহী হওয়া উচিত । এই কারণেই মাইক্রোসফ্ট প্রকারভেদকে "হাঁসের টাইপিং" বলে।

সুতরাং, আমি যখন পরিবর্তনটি ব্যবহার করে এটি ঘোষণা করি তখন কী করে var? সহজ, এটি ইন্টেলিজেন্স আমাকে যা বলবে তা করে। সি # সম্পর্কে যে কোনও যুক্তি যা আইডিই উপেক্ষা করে তা বাস্তবতার অভাব হয়। অনুশীলনে, প্রতিটি সি # কোড একটি আইডিইতে প্রোগ্রাম করা হয় যা ইন্টেলিজেন্স সমর্থন করে।

যদি আমি একটি varঘোষিত ভেরিয়েবল ব্যবহার করি এবং ভেরিয়েবলটি কীসের জন্য বিভ্রান্ত হয় তবে আমার কোডের সাথে মূলত কিছু ভুল আছে। varকারণ নয়, এটি কেবল লক্ষণগুলিকে দৃশ্যমান করে তোলে। মেসেঞ্জারকে দোষ দিবেন না।

এখন, সি # টিম একটি কোডিং গাইডলাইন প্রকাশ করেছে যা জানিয়েছে যে কেবলমাত্র একটি লিনিক্যু বিবৃতি প্রকাশের জন্য ব্যবহার করা varউচিত যা একটি বেনামে টাইপ তৈরি করে (কারণ এখানে, আমাদের কোনও আসল বিকল্প নেই )। ভাল, যে স্ক্রু। যতক্ষণ না সি # টিম আমাকে এই গাইডলাইনটির জন্য দৃ argument় যুক্তি দেয় না, ততক্ষণ আমি এটিকে অগ্রাহ্য করব কারণ আমার পেশাদার এবং ব্যক্তিগত মতামত অনুসারে এটি খাঁটি বালুনি। (দুঃখিত; আমি প্রশ্নের উত্তর দিকনির্দেশটির কোনও লিঙ্ক পাইনি))var

আসলে, কেন আপনার ব্যবহার করবেন না সে সম্পর্কে কিছু (অতিমাত্রায়) ভাল ব্যাখ্যা রয়েছে varতবে আমি এখনও বিশ্বাস করি যে তারা বেশিরভাগ ক্ষেত্রেই ভুল। "অনুসন্ধানযোগ্যতা" উদাহরণটি ধরুন: লেখক দাবি করেছেন যে যে varজায়গাগুলি MyTypeব্যবহৃত হয় সেখানে অনুসন্ধান করা শক্ত করে তোলে । ঠিক। সুতরাং ইন্টারফেস না। আসলে, কেন আমি ক্লাসটি কোথায় ব্যবহৃত হচ্ছে তা জানতে চাইব? এটি তাত্ক্ষণিক হয় যেখানে আমি আরও আগ্রহী হতে পারি এবং এটি এখনও অনুসন্ধানযোগ্য হবে কারণ কোথাও কোথাও এর নির্মাতাকে ডাকতে হবে (এমনকি এটি পরোক্ষভাবে করা হলেও, টাইপের নামটি কোথাও উল্লেখ করতে হবে)।


14
কোনও শালীন আইডিইতে, আপনি শ্রেণি ব্যবহারের জন্য কোনও পাঠ্য অনুসন্ধান ব্যবহার করেন না, আপনি এটি পার্স গাছের ভিত্তিতে এটি করতে আইডিই পাবেন বা অন্যথায় এটি বস্তুর প্রকারগুলি সনাক্ত করে। যেহেতু আমরা স্ট্যাটিক টাইপিংয়ের কথা বলছি, এটি অনামিকার ধরণের ব্যতীত সমস্ত কিছুই খুঁজে পাবে।
ডাস্টম্যান

6
আমি কোনও ডকুমেন্টেশন এবং ভেরার উদার ব্যবহারের সাথে 100k লাইনের উত্স উত্তরাধিকারে ঘৃণা করব। বিশেষত যদি আপনি কম-থেকে-কার্যকর ভেরিয়েবল নামের সাথে ভ্যার সংযুক্ত করে। প্রোডাকশন কোডে তবে কোনও পয়েন্ট (বা বেনামে ধরণের আচরণ করে) চিত্রিত করার সময় আমি এটি সহায়ক হতে পারি?
শেয়া

7
আর্নিয়াশিয়া: ভাল আপনি ইতিমধ্যে সেখানে আসল সমস্যাটির দিকে ইঙ্গিত করেছেন: অকেজো ভেরিয়েবলের নাম এবং নিখোঁজ ডকুমেন্টেশন । আমি varবিভ্রান্তিতে কী ভূমিকা রাখে তা দেখতে সত্যিই ব্যর্থ । অবশ্যই, এমন কিছু ক্ষেত্রে থাকতে পারে যেখানে ভেরিয়েবলের ধরণ / আকারের উপর জোর দেওয়া গুরুত্বপূর্ণ (যেমন নিম্ন স্তরের বিট ক্রিয়াকলাপ)। এটি দুর্দান্ত: কেউ কখনও দাবি করেন নি যে varএকচেটিয়াভাবে ব্যবহার করা উচিত। নিয়মটি সহজ: যদি এটি সত্যিই বিভ্রান্তির কারণ হয় তবে এটি ব্যবহার করবেন না।
কনরাড রুডল্ফ

17
আমি দেখেছি বারের বিপরীতে প্রতিটি উদাহরণই ধরে নিয়েছে যে প্রোগ্রামার অর্থহীন ভেরিয়েবলের নাম ব্যবহার করবে। তবে সম্ভবত এই কারণেই স্পষ্টভাবে কোনও প্রকার নির্দিষ্ট করে দেওয়ার চেয়ে var ভাল It এটি প্রোগ্রামারকে ভাল পরিবর্তনশীল নামগুলি নিয়ে আসতে বাধ্য করে।
রায়ান লুন্ডি

16
মাইক্রোসফ্ট প্রকারভেদকে "হাঁসের টাইপিং" নামেও ডাকে। - তারা কি সত্যিই? আমি হতবাক হয়ে গিয়েছিলাম ...
আন্তন টিখি

118

ভার, আমার মতে, সি # তে একটি ভাল জিনিস টিএম । টাইপ করা যেকোন ভেরিয়েবলটি এখনও দৃ strongly়ভাবে টাইপ করা থাকে তবে এটি নির্ধারিত অ্যাসাইনমেন্টের ডান হাতের দিক থেকে এটি টাইপ পায়। যেহেতু প্রকারের তথ্যটি ডান হাতের কাছে পাওয়া যায়, বেশিরভাগ ক্ষেত্রে, এটি অপ্রয়োজনীয় এবং অতিরিক্ত ভার্চুজের জন্য বাম-হাতের অংশে প্রবেশ করতে হবে। আমি মনে করি এটি প্রকারের সুরক্ষা হ্রাস না করে পঠনযোগ্যতা উল্লেখযোগ্যভাবে বৃদ্ধি করে।

আমার দৃষ্টিকোণ থেকে, পরিবর্তনশীল এবং পদ্ধতির জন্য ভাল নামকরণের কনভেনশনগুলি সুস্পষ্ট প্রকারের তথ্যের চেয়ে পাঠযোগ্যতার দৃষ্টিকোণ থেকে গুরুত্বপূর্ণ। আমার যদি প্রকারের তথ্যের প্রয়োজন হয় তবে আমি সর্বদা ভেরিয়েবলের উপরে (ভিএস-এ) ঘুরে বেড়াতে পারি এবং তা পেতে পারি। সাধারণত, যদিও, স্পষ্টত ধরণের তথ্য পাঠকের জন্য প্রয়োজনীয় হওয়া উচিত নয়। বিকাশকারীটির জন্য, ভিএসে আপনি এখনও ভেরিয়েবলটি কীভাবে ঘোষণা করা হয় তা বিবেচনা না করেই ইন্টেলিসেন্স পাবেন। সব কিছু বলার পরেও এমন কিছু ঘটনা ঘটতে পারে যেখানে স্পষ্টভাবে প্রকারটি ঘোষণা করার কোনও অর্থ নেই - সম্ভবত আপনার কাছে এমন একটি পদ্ধতি রয়েছে যা প্রত্যাবর্তন করে List<T>তবে আপনি এটি হিসাবে বিবেচনা করতে চানIEnumerable<T>আপনার পদ্ধতিতে আপনি ইন্টারফেসটি ব্যবহার করছেন তা নিশ্চিত করার জন্য, ইন্টারফেসের ধরণের ভেরিয়েবল ঘোষণা করে এটি স্পষ্ট করে তুলতে পারে। অথবা, সম্ভবত, আপনি প্রাথমিক মান ব্যতীত একটি ভেরিয়েবল ঘোষণা করতে চান - কারণ এটি কিছু শর্তের ভিত্তিতে অবিলম্বে একটি মান পায়। সেক্ষেত্রে আপনার টাইপটি দরকার। প্রকারের তথ্য যদি দরকারী বা প্রয়োজনীয় হয় তবে এগিয়ে যান এবং এটি ব্যবহার করুন। যদিও আমি অনুভব করি যে এটি সাধারণত প্রয়োজন হয় না এবং কোডটি বেশিরভাগ ক্ষেত্রে এগুলি ছাড়া পড়া সহজ।


3
আমি সামগ্রিকভাবে একমত। আমার মতে এখানে মূল বক্তব্যটি নিশ্চিত হওয়া উচিত যে অভিপ্রায়টি পরিষ্কার। এটি যদি দলের বেশিরভাগ বিকাশকারীদের কাছে পরিষ্কার না থাকে তবে তা ক্ষতিকারক, সহায়ক নয়। এটি বলেছিল, আমি ব্যক্তিগতভাবে এটির একটি বিশাল অনুরাগী, তবে আমার দলের অন্যান্য দেবগণ যখন আমার অভিপ্রায় নির্ধারণ করতে সমস্যায় পড়েছিলেন তখন নিজেকে কিছুটা লাগিয়ে রাখতে হয়েছিল। চিত্রে যান.
স্টিভ ব্রোলিলার্ড

3
হ্যাঁ, টাইপটি যখন বাম দিকে থাকে তখন আমি পড়তে সহজ মনে করি। রিশার্পার ব্যবহার করে, আমাকে যাইহোক ডানদিকে টাইপটি টাইপ করতে হবে না, সুতরাং এটি আমাকে বিরক্ত করে না।
ব্লুরাজা - ড্যানি পিফ্লুঘুফ্ট

1
@ ব্লুরাজা - আমি দেখতে পেয়েছি যে ভাল পরিবর্তনশীল নামগুলি ব্যবহার করা সাধারণত বোঝার জন্য যাইহোক প্রকৃত প্রকারের সাথে বিরক্ত হওয়ার প্রয়োজনকে দূর করে। ইন্টেলিসেন্স এখনও "ভার" সংজ্ঞায়িত ভেরিয়েবলগুলিতে উপলভ্য, সুতরাং কোডিং করার সময় এর উপর কোনও পদ্ধতি / সম্পত্তি চয়ন করার জন্য আমার প্রকারটি জানতে হবে না।
tvanfosson

2
আপনি কোডটি পড়তে হবে এমন সময় কোডিং করার সময় এটি খুব বেশি নয়।
ব্লুরাজা - ড্যানি পিফ্লুঘুফ্ট

1
আমার অবশ্যই তখন ঘন দিকে থাকতে হবে, আমি যে কোডটি পড়ছি তা সঠিকভাবে বুঝতে সক্ষম হওয়ার জন্য আমাকে ভাল পদ্ধতি এবং পরিবর্তনশীল নাম এবং যে ধরণের অপারেশন করা হচ্ছে তার একটি বোঝার প্রয়োজন। আমি মনে করি আপনি সঠিক আছেন যদিও এটি বড় সমস্যার লক্ষণাত্মক। ভরসা এক। কোডটি এটি যা করছে বলে মনে হচ্ছে তা করছে কি না তা নিশ্চিত হওয়ার জন্য আপনার ব্যবহার করা ধরণের সম্পর্কে নিশ্চিত হওয়া উচিত be
অ্যান্থনিডব্লোন জোন্স

91

এগুলির কোনোটাই একদম সত্য নয়; varপাঠযোগ্যতার উপর ইতিবাচক এবং নেতিবাচক প্রভাব উভয়ই থাকতে পারে। আমার মতে, varনিম্নলিখিতগুলির যে কোনও একটি সত্য হলে ব্যবহার করা উচিত:

  1. প্রকারটি বেনামে রয়েছে (ভাল, আপনার এখানে কোনও পছন্দ নেই, কারণ এটি অবশ্যই ক্ষেত্রে বৈচিত্রময় হতে হবে )
  2. টাইপটি নির্ধারিত অভিব্যক্তির (যেমন var foo = new TypeWithAReallyLongNameTheresNoSenseRepeating()) ভিত্তিতে সুস্পষ্ট

varসিনট্যাকটিক চিনির হিসাবে এর কোনও কার্যকারিতা প্রভাব নেই; সংকলকটি টাইপটি অনুমান করে এবং একবার এটি আইএল-এ সংকলিত হয়; এটি সম্পর্কে আসলে গতিশীল কিছুই নেই ।


1
উভয়ের সাথে একমত, যদিও আমার দ্বিতীয় মামলার উপর দীর্ঘ প্রতিবন্ধকতা রয়েছে, যদি কোনও টাইপ দীর্ঘ হয় তবে এটি সাধারণত জেনেরিক প্রকারের সাথে প্রচুর নেস্টেড জেনেরিক আর্গুমেন্ট থাকে, সেক্ষেত্রে একটি দৃ strongly়ভাবে টাইপ করা "টাইপওয়াইথারলিলিওলনেম থেরেসনোসেন্সরেপিটিংয়ের সমান টাইপ করা" আরও অর্থবোধ করে
আয়ন টডিরেল

12
আমার ধর্মীয় যুদ্ধ শুরু করার কোনও ইচ্ছা নেই তবে আমি ব্যক্তিগতভাবে আয়নটির সাথে একমত নই। আমি একটি সংক্ষিপ্ত এবং সম্ভবত দ্বিধাহীন সংক্ষিপ্ত সংক্ষিপ্ত নামের চেয়ে খুব দীর্ঘ, তবে খুব সূক্ষ্ম ধরণের নাম (আলা আঙ্কেল বব মার্টিন) পছন্দ করব prefer নামটির দৈর্ঘ্যকে কৃত্রিমভাবে স্ফীত করার সাথে আমি সম্মত নই যে সাবধানতাটি আমি যুক্ত করব। 5 অক্ষরের একটি সংক্ষিপ্ত নাম পরিষ্কারভাবে অভিপ্রায় দেখায় সৃষ্টি, তাহলে 5 এবং 25 ব্যবহার
স্টিভ Brouillard

2
@ স্টিভ: আমাকে আপনার সাথে একমত হতে হবে; একটি "শর্ট টাইপ" তৈরি করা (যার অর্থ আমি আপনার নামটি সংক্ষিপ্ত করার উদ্দেশ্যে নির্দিষ্ট জেনেরিক টাইপ থেকে উত্তরাধিকার হিসাবে বোঝাচ্ছি) তৈরি করা ভাল অভ্যাস নয়; এটির জেনেরিক টাইপ থেকে যে কোনও কনস্ট্রাক্টরকে নকল করা এবং পাশ কাটাতে হবে পাশাপাশি জেনেরিক টাইপ থেকে ফাংশনে উত্তরাধিকার সূত্রে প্রাপ্ত একটি ভিন্ন ধরণের পাস করতে আপনাকে আটকাতে হবে। আপনি উত্তরাধিকার যেমনটি ব্যবহার করছেন typedefনা তেমন ব্যবহার করছেন।
অ্যাডাম রবিনসন

7
varপ্রকারটি স্পষ্ট হলে ব্যবহার করবেন ? হতে পারে, তবে সত্যিকারের লাভটি যখন ধরণের কোনও বিষয় নয়। আপনি যদি এমন কাজ var customers = whatever; var query = from c in customers select stuffকরে থাকেন তবে 'গ্রাহকদের' সঠিক ধরণের কী তা বিবেচনাধীন নয়। আপনি এটি কীভাবে ব্যবহার করতে পারবেন এটি স্পষ্ট এবং এটি যথেষ্ট। এবং যদি প্রকৃত প্রকারটি জটিল হয় তবে এটি দমন করা সার্থক।
জোরেেন

2
@ ক্রিস্টোফার: আমি ট্যাগগুলির জগাখিচুড়ি দূর করতে চাই বুঝতে পারি, তবে সেগুলি ক্লাসে আবদ্ধ করা (আইএমও) একটি গ্রহণযোগ্য বিকল্প নয়, কারণ আপনি সেই জেনেরিক ধরণের কোনও অন্য (বৈধ) শিশু শ্রেণির সম্ভাবনা বাদ দিয়ে দেন you একটি বৈধ পরামিতি। আমি বরং using ShortType = LongGenericType<A,B,C>কোনও ফাইলের শীর্ষে একটি নির্দেশিকা ব্যবহার করব , যেহেতু এটি একই পাঠযোগ্যতা দেয়, আপনি নির্মাণকারীদের পুনরায় তৈরি করার প্রয়োজন হয় না, এবং পরীক্ষার্থী হওয়া থেকে শিশু শ্রেণিগুলি বাদ দেন না।
অ্যাডাম রবিনসন

68

এরিক লিপার্ট, সি # টিমের সিনিয়র সফটওয়্যার ডিজাইন ইঞ্জিনিয়ার থেকে:

মূল varশব্দটি চালু করা হল কেন ?

দুটি কারণ রয়েছে, একটি যা আজ বিদ্যমান, একটি যা 3.0 এ উত্পন্ন হবে।

প্রথম কারণটি হ'ল সমস্ত অপ্রয়োজনীয়তার কারণে এই কোডটি অবিশ্বাস্যভাবে কুৎসিত:

Dictionary<string, List<int>> mylists = new Dictionary<string, List<int>>();

এবং এটি একটি সহজ উদাহরণ - আমি আরও খারাপ লিখেছি। যে কোনও সময় আপনি ঠিক একই জিনিস দু'বার টাইপ করতে বাধ্য হন, এটি একটি অপ্রয়োজনীয় যা আমরা মুছে ফেলতে পারি। অনেক ভাল লিখতে

var mylists = new Dictionary<string,List<int>>();

এবং অ্যাসাইনমেন্টের ভিত্তিতে টাইপটি কী তা সংকলকটিকে নির্ধারণ করতে দিন।

দ্বিতীয়ত, সি # 3.0 বেনামে প্রকারের পরিচয় দেয়। যেহেতু সংজ্ঞা দ্বারা বেনামী ধরনের কোন নাম আছে, আপনি প্রয়োজন আরম্ভের অভিব্যক্তি থেকে পরিবর্তনশীল ধরণ অনুমান করা যদি তার টাইপ বেনামী পাবে।

জোর আমার। পুরো নিবন্ধটি, সি # 3.0 এখনও স্থিরভাবে টাইপ করা হয়েছে, সৎ! , এবং পরবর্তী সিরিজগুলি বেশ ভাল।

এই কি varজন্য হয়। অন্যান্য ব্যবহার সম্ভবত এত ভাল কাজ করবে না। জেএসক্রিপ্ট, ভিবিএস স্ক্রিপ্ট, বা ডায়নামিক টাইপিংয়ের সাথে যে কোনও তুলনা হ'ল মোট বঙ্ক। নোট আবার, varহয় প্রয়োজনীয় অর্ডার .NET নির্দিষ্ট অন্যান্য বৈশিষ্ট্য কাজ আছে হবে।


আমি লিপার্টের যুক্তিটিকে অদ্ভুত বলে মনে করি। কেউ দ্বিতীয় শ্রেণীর নাম টাইপ করে না, তারা তাদের জন্য এটি লিখতে দেয় ইনটেলিসেন্স, তবে তারপরে সে ঘুরে দাঁড়ায় এবং দাবি করেন যে বর্ণটি আরও ভাল কারণ সংকলক / ইন্টেলিসেন্স এটি কাজ করে। আপনি এটি উভয় উপায়ে থাকতে পারে না!
ডেভ

5
সি # টিম ইন্টেলিজেন্স নিয়ন্ত্রণ করে না, তারা সংকলকটি নিয়ন্ত্রণ করে। যে কোনও ইভেন্টে এটি মূল সমস্যা নয়। আমি মনে করি না যে ভ্যার একা টাইপিং সাশ্রয়ের উপর 100 পয়েন্ট তৈরি করেছে।
ডাস্টম্যান

@ ডাস্টম্যান: ভার টাইপিং মোটেও সংরক্ষণ করে না। এটি আপনাকে আরও লিখতে বাধ্য করে!
পাইওটর পেরাক

53

আমি মনে করি বর্ণের ব্যবহারের সাথে বুদ্ধিমানের সাথে নির্বাচিত ভেরিয়েবলের নাম করা উচিত।

ভবিষ্যত বিবৃতিতে ভ্যার ব্যবহার করতে আমার কোনও সমস্যা নেই, তবে শর্ত থাকে যে এটি এর মতো না থাকে:

foreach (var c in list) { ... }

যদি এটি আরও ভালো হত:

foreach (var customer in list) { ... }

... তারপরে কেউ এই কোডটি পড়লে "তালিকা" কী তা বোঝার সম্ভাবনা অনেক বেশি। যদি তালিকার নামটি নিজেই ভেরিয়েবলের উপর নিয়ন্ত্রণ করে তবে তা আরও ভাল।

একই অবস্থা অন্যান্য পরিস্থিতিতেও প্রযোজ্য। এটি বেশ অকেজো:

var x = SaveFoo(foo);

... তবে এটি উপলব্ধি করে:

var saveSucceeded = SaveFoo(foo);

প্রতিটি তার নিজের, আমার ধারণা। আমি নিজেকে এটি করতে পেয়েছি, যা কেবল উন্মাদ:

var f = (float)3;

আমার 12 ধাপের ভেরি প্রোগ্রামটি কিছুটা দরকার। আমার নাম ম্যাট, এবং আমি (আব) var ব্যবহার করি।


6
ভাল "var f = (ভাসা) 3" এর সাথে একমাত্র ভুল wrong এটি হ'ল এটি "var f = 3f" বা "var f = 3.0 (একক নির্ভুলতা সাফল্যের কারণ)" হওয়া উচিত।
মাইকেলজিজি

3
হ্যাঁ হ্যাঁ 3f বা 3.0 এ যাওয়ার উপায়! আমাদের ভারি পাগলদের একসাথে থাকতে হবে!
ম্যাট হ্যামিল্টন

27
সেই প্রথম উদাহরণটিতে আসল সমস্যাটি হ'ল "তালিকা", "সি" নয়। "তালিকা" কিসের ? "তালিকা" এর নাম পরিবর্তন করে "গ্রাহক", বা "গ্রাহকরা ওজনমনি", বা "কারেন্ট কাস্টোমার্স" বা আরও কিছু বর্ণনামূলক হতে হবে। এবং একবার আপনার কাছে এটি হয়ে গেলে, "গ" যেমন রয়েছে তেমন থাকতে পারে, কারণ এটি ইতিমধ্যে আপনি কী জানেন তা জানেন।
রায়ান লুন্ডি

4
হাই ম্যাট! আমার নাম কেনি এবং আমি একজন বারাডিক্টিক্ট।
কেনে

var ম্যাটহামিল = "লুক স্কাইওয়াকার"; // এটি থেকে একটি টন ছিনিয়ে নিয়েছে
বিনোজ অ্যান্টনি

40

আপনি নতুন বিকাশের চেয়ে আপনি রক্ষণাবেক্ষণ মোডে একাধিকবার বেশি সময় ব্যয় করেন এই ধারণার ভিত্তিতে আমরা "মেশিন নয়, মানুষের জন্য কোড" নীতিটি গ্রহণ করেছি।

আমার জন্য, এটি এই যুক্তিটি বাতিল করে যে সংকলকটি "জানে" ভেরিয়েবলটি কী প্রকারের - নিশ্চিত, আপনি প্রথমবার অবৈধ কোডটি লিখতে পারবেন না কারণ সংকলকটি আপনার কোডটি সংকলন থেকে থামিয়েছে, তবে পরবর্তী বিকাশকারী যখন কোডটি পড়ছেন তখন 6 মাসের সময় তাদের ভেরিয়েবলটি সঠিকভাবে বা ভুলভাবে কী করছে তা অনুমান করতে সক্ষম হওয়া এবং সমস্যার কারণগুলি দ্রুত সনাক্ত করতে হবে।

সুতরাং,

var something = SomeMethod();

আমাদের কোডিং মান দ্বারা অবৈধ, কিন্তু নিম্নলিখিতটি আমাদের টিমে উত্সাহিত করা হয়েছে কারণ এটি পাঠযোগ্যতা বৃদ্ধি করে:

var list = new List<KeyValuePair<string, double>>();
FillList( list );
foreach( var item in list ) {
   DoWork( item ); 
}

4
আমি খুঁজে পেয়েছি ("লোকেদের জন্য কোড, মেশিন নয়") একটি সেরা গাইডলাইন হতে - এটি অনুসরণ করার ফলে আরও ভাল কোড পাওয়া যায় এবং অকাল অপ্টিমাইজেশন এড়াতে সহায়তা করে।
থানাটোস

3
আমি var তালিকা = নতুন কীভ্যালিউয়ার <স্ট্রিং, ডাবল> পাচ্ছি না? আমার জন্য তালিকার চেয়ে বেশি কিছু থাকতে পারে।
টিটিটি

"মানুষের জন্য কোড, মেশিন নয়" - আমেন।
ব্যবহারকারী 1068352

39

এটি খারাপ নয়, এটি আরও শৈলীগত জিনিস, যা বিষয়গত হতে থাকে। এটি অসঙ্গতিগুলি যুক্ত করতে পারে, আপনি যখন ভার ব্যবহার করেন এবং কখন ব্যবহার করবেন না।

উদ্বেগের আর একটি বিষয়, নিম্নলিখিত কলটিতে আপনি কেবল কোডটি টাইপ করে ফিরে দেখে তা বলতে পারবেন না CallMe:

var variable = CallMe();

এটি আমার বিরুদ্ধে মূল অভিযোগ complain

আমি পদ্ধতিগুলিতে বেনাম প্রতিনিধি ঘোষণা করার সময় আমি var ব্যবহার করি, আমি যদি ব্যবহার করি তবে তার চেয়ে কোনওরকম পরিচ্ছন্ন দেখাচ্ছে Func। এই কোডটি বিবেচনা করুন:

var callback = new Func<IntPtr, bool>(delegate(IntPtr hWnd) {
   ...
});

সম্পাদনা : জুলিয়ান ইনপুট এর উপর ভিত্তি করে সর্বশেষ কোড নমুনা আপডেট করেছে


3
তবে আপনি কি সেই লাইনে ঠিক সেখানে টাইপটি জানা উচিত? আপনি জানেন যে কলমি কিছু ফেরত দেয়; স্থানীয় পর্যায়ে ভেরিয়েবল variableতৈরি হয়েছে তা জানা কি যথেষ্ট নয় ? আপনি যদি আপনার উদাহরণটি প্রসারিত না করেন তবে আইএমও এটি খুব শক্ত অভিযোগ নয়।
র্যান্ডলফো

2
এটি ভার্বোজ না হওয়ার বিষয়ে নয়, এটি কম্পাইলারকে আপনার সিনট্যাক্স চিনির জন্য না দেওয়ার বিষয়ে। এটি বিবেচনা করুন: var getter ..., এখন এই ফানক <অবজেক্ট> গেটর ..., দ্বিতীয়টির সাথে আপনি জানেন যে আপনাকে কোনও পরামিতি সরবরাহ করতে হবে না এবং এটি কী ফিরে আসে। আপনি "কী করবেন" শুরু থেকেই জানেন এবং কোনও কিছু ডিজাইন করার সময় বা রিফ্যাক্টর করার সময় দ্রুত সিদ্ধান্ত নিতে পারেন। হাতে থাকা সমস্ত তথ্য থাকা আরও কয়েকটি চরিত্রের চেয়ে গুরুত্বপূর্ণ। আপনি কেবল প্রচুর কোড নিয়ে কাজ করার সময় এটির প্রশংসা করা যেতে পারে।
অয়ন টোডেরেল

2
যেহেতু আমরা সকলেই যেভাবে ভিজ্যুয়াল স্টুডিও সম্পর্কে কথা বলছি, আপনার মাউসটিকে এক সেকেন্ডের জন্য ভেরিয়েবলের উপরে ঘোরাতে এবং এটি কী ধরণের তা দেখে বড় বিষয় কী? যাইহোক ঘোষণায় যাওয়ার চেয়ে অনেক বেশি ভাল।
রুবিস

3
জেনেরিক ভেরিয়েবল এবং ফাংশন নাম ( variable, CallMe) খারাপ উদাহরণ দেয়। যাইহোক, যদি CallMe()কোনও "ফোন অ্যাপ্লিকেশন" কোনও ধরণের কোনও ফাংশন ছিল, তবে var call = CallMe(); .... call.HangUp();আরও অনেক বেশি অর্থবোধ করতে পারত।
ডানকো দুর্বিć

3
@ র্যান্ডলফো: "আপনার মাউসটিকে এক সেকেন্ডের জন্য ভেরিয়েবলের উপরে ঘোরাতে এবং এটি কী ধরণের তা দেখে বড় বিষয় কী?" এটি রক্ষণাবেক্ষণ ওভারহেডে সময় যোগ করে ... প্লাস এক সেকেন্ডটি মাউস প্রসঙ্গ সুইচটিতে কীবোর্ড গণনা না করে কেবল হোভার সময় is আমি আপনার সম্পর্কে জানি না, তবে আমি একটি সময়সীমা নিয়ে কাজ করি। এটি প্রতিবার কী ধরণের তা জানতে আমাকে যখনই কোনও ভেরিয়েবলের উপরে ঘোরাফেরা করতে হয় তখন সময় হয় যে আমি সমস্যার সমাধান করতে আরও ভাল সময় ব্যয় করতে পারি।
পাওয়ারলর্ড

36

ভার মোটেই ভেরিয়েন্টের মতো নয়। ভেরিয়েবলটি এখনও দৃ strongly়ভাবে টাইপ করা হয়, এটি কেবল এটির জন্য আপনি কীগুলি টিপেন না। প্রকারটি দেখতে আপনি ভিজ্যুয়াল স্টুডিওতে এটিকে ঘুরে দেখতে পারেন। আপনি যদি মুদ্রিত কোডটি পড়ছেন, তবে টাইপটি কী তা বোঝার জন্য আপনাকে কিছুটা চিন্তা করতেই পারে। তবে কেবলমাত্র একটি লাইন এটি ঘোষণা করে এবং এটি ব্যবহার করে এমন অনেকগুলি লাইন, তাই জিনিসকে শালীন নাম দেওয়া আপনার কোড অনুসরণ করা সহজ করার পক্ষে এখনও সেরা উপায়।

ইন্টেলিজেন্স অলস ব্যবহার করছেন? এটি পুরো নামের চেয়ে কম টাইপিং। বা এমন কিছু জিনিস রয়েছে যা কম কাজ করে তবে সমালোচনার দাবি রাখে না? আমি মনে করি সেখানে রয়েছে, এবং ভারগুলি তাদের মধ্যে একটি।


6
+1, কেবলমাত্র এমন ব্যক্তি যা নন varতার সাথে কোনও সম্পর্ক নেই Variant
user7116

27

আপনার সম্ভবত এটি প্রয়োজন বেনামি ধরণের জন্য (যেখানে এটি 100% প্রয়োজনীয়); তবে এটি তুচ্ছ মামলার পুনরাবৃত্তি এড়িয়ে যায় এবং আইএমও লাইনটি আরও পরিষ্কার করে দেয়। সরল সূচনা করার জন্য আমার টাইপটি দুবার দেখার দরকার নেই।

উদাহরণ স্বরূপ:

Dictionary<string, List<SomeComplexType<int>>> data = new Dictionary<string, List<SomeComplexType<int>>>();

(দয়া করে উপরের এইচএসক্রোলটি সম্পাদনা করবেন না - এটি বিন্দুটি প্রমাণ করে !!!)

বনাম:

var data = new Dictionary<string, List<SomeComplexType<int>>>();

যাইহোক, এমন ইভেন্টগুলি আছে যখন এটি বিভ্রান্তিকর হয় এবং সম্ভাব্যভাবে বাগ তৈরি করতে পারে। varযদি আসল ভেরিয়েবল এবং প্রারম্ভিক টাইপটি অভিন্ন না হয় তবে ব্যবহারে সতর্ক হন । উদাহরণ স্বরূপ:

static void DoSomething(IFoo foo) {Console.WriteLine("working happily") }
static void DoSomething(Foo foo) {Console.WriteLine("formatting hard disk...");}

// this working code...
IFoo oldCode = new Foo();
DoSomething(oldCode);
// ...is **very** different to this code
var newCode = new Foo();
DoSomething(newCode);

1
(তথ্যের জন্য, আপনি যেখানেই এটি অন্তর্নিহিত ধরণের রূপান্তর সেখানে যে কোনও বিষয়ে অনুরূপ সমস্যা পেতে পারেন)
মার্ক গ্র্যাভেল

1
যে অংশটি আপনি একই লাইনে দুবার দেখতে চান না তার সাথে দ্বিমত পোষণ করুন। এটা সম্ভব যে ভবিষ্যতে আপনি সরাসরি ঘোষণার পরে পরিবর্তনশীল তৈরি করছেন না (উদাহরণস্বরূপ যদি সংজ্ঞার নীচে যদি একটি ক্ষেত্রে থাকে) তবে এটি প্রকারটি কী তা সরাসরি পরিষ্কার নয়। বেশিরভাগ বিকাশকারীরা লাইনের শুরুতে সরাসরি টাইপটি দেখতে ব্যবহার করা হয় বিশেষত জটিল কোডগুলিতে আপনি কোডটি পড়া আরও কঠিন করতে চান না।
জার্মটজান

@ দ্য ভিলেজআইডিয়ট - আমি আপনার সম্পাদনাটি ফিরিয়ে দিয়েছি, কারণ এই উপলক্ষে এইচএসক্রোলটি এই বিন্দুটির সাথে সম্পর্কিত ;
মার্ক গ্র্যাভেল

2
@ জার্মটজান - আমার মস্তিষ্ক সীমাবদ্ধ; যদি এটি জটিল হয় তবে আমি এটি দুটিবার দেখতে চাই না এবং তুলনা (ইন্টারফেস / কংক্রিট / ইত্যাদি) শুরু করতে চাই। আমি এটি একবার দেখতে পেরে খুশি এবং "তাদের মধ্যে একটি হিসাবে টাইপ করা" ভাবেন।
মার্ক গ্র্যাভেল

17

একটি নির্দিষ্ট ক্ষেত্রে যেখানে ভেরি দেওয়া কঠিন: অফলাইন কোড পর্যালোচনাগুলি, বিশেষত কাগজে লেখাগুলি।

আপনি তার জন্য মাউস-ওভারের উপর নির্ভর করতে পারবেন না।


17
আপনি কেন কাগজে কাগজ পর্যালোচনা করছেন? গাছের কথা ভাবি! ;)
ডাস্টম্যান

8
ভের ব্যবহার না করেই আপনার একই সমস্যা হতে পারে। সমস্যাটি বৈচিত্র নয়; সমস্যাটি খারাপ ভেরিয়েবলের নাম। যদি ভেরিয়েবলের নামগুলি ভালভাবে বেছে নেওয়া হয় তবে ভের ব্যবহারটি কোনও বিষয় নয়।
রায়ান লুন্ডি

আমার দলে আমার একজন লোক আছে যা তার নিজস্ব কোডটি পর্যালোচনা করে এবং তার কোড মুদ্রণ করে বাগগুলি সন্ধান করে। তার দেয়াল কোড সহ আচ্ছাদিত। আমি একবার হেঁটেছিলাম এবং তার একটি ডিবাগিং অনুশীলনগুলির একটিতে একটি পুরো বিশাল হোয়াইটবোর্ড coveredাকা ছিল। এটি সম্ভবত ~ 10000 এলওসি
বীপ বীপ

পরিবর্তনশীল নামগুলি একাই সমস্যার সমাধান করতে পারে না আপনি যদি না আবার হস্তি শিরোনামে ফিরে যান যেখানে এই নামের নামের অংশ রয়েছে।
কেভিন গাল

17

বড় ব্যাপার কী তা আমি দেখছি না ..

var something = someMethod(); // Type of 'something' not clear <-- not to the compiler!

আপনার এখনও 'কিছু' র বিষয়ে পূর্ণ বুদ্ধি রয়েছে এবং যে কোনও দ্ব্যর্থক মামলার জন্য আপনার ইউনিট পরীক্ষা আছে, তাই না? (আপনি কি?)

এটি ভারচার নয়, এটি ম্লান নয় এবং এটি অবশ্যই গতিশীল বা দুর্বল টাইপিং নয়। এটি ম্যাডনেসকে এভাবে থামছে:

List<somethinglongtypename> v = new List<somethinglongtypename>();

এবং এই মোট মানসিক চাপকে হ্রাস করে:

var v = new List<somethinglongtypename>();

দুর্দান্ত, ততটা সুন্দর নয়:

v = List<somethinglongtypename>();

তবে বু সেই জন্যই


'কিছুর' প্রকারটি সংকলকের কাছে খুব স্পষ্ট, অভ্যন্তরীণভাবে, "ভার" রিটার্ন টাইপ 'সামথমেথড' এ সেট হয়ে যায়, এটি সংকলকটির সাথে পরিষ্কার, তবে প্রকল্পে কাজ করা বিকাশকারীদের কাছে এটি পরিষ্কার নয় clear এবং বু আমার উপর দ্রুত বাড়ছে।
স্টেফেনবায়ার

না, v = List<somethinglongtypename>();এমনকি ভাল না। একটি নতুন ভেরিয়েবল প্রবর্তন এবং বিদ্যমান ভেরিয়েবলকে নির্ধারণের মধ্যে পার্থক্য করা গুরুত্বপূর্ণ।
হাইকম্যান্ডার 4

ঠিক আছে যদি আপনি বর্তমান স্কোপ এর আগে 'ভি' তে নির্ধারিত হয়ে থাকেন, তবে এটি বিদ্যমানটির ক্ষেত্রে অ্যাসাইনমেন্ট। অন্যথায় এটি নতুন ভেরিয়েবল 'v' এর জন্য অ্যাসাইনমেন্ট। সহজ।
ফ্রেপ ডি-ওরেঞ্জ

17

যদি কেউ কীওয়ার্ডটি ব্যবহার করে varকারণ তারা "প্রকারটি বের করতে" চান না, তবে এটি অবশ্যই ভুল কারণ। দ্যvarশব্দ একটি গতিশীল ধরনের সঙ্গে একটি পরিবর্তনশীল তৈরি হয় না কম্পাইলার এখনও টাইপ জানা আছে। যেহেতু ভেরিয়েবলের সর্বদা একটি নির্দিষ্ট প্রকার থাকে, টাইপটি কোডেও সম্ভব হলে স্পষ্ট হওয়া উচিত।

varকীওয়ার্ডটি ব্যবহারের ভাল কারণগুলি উদাহরণস্বরূপ:

  • যেখানে এটি প্রয়োজন, অর্থাত্ একটি বেনামি ধরণের জন্য একটি রেফারেন্স ঘোষণা করা।
  • যেখানে এটি কোডটিকে আরও পঠনযোগ্য করে তোলে, অর্থাত্ পুনরাবৃত্তিমূলক ঘোষণাগুলি সরিয়ে ফেলুন।

ডেটা টাইপ লেখার ফলে কোডটি অনুসরণ করা প্রায়শই সহজ হয়। এটি দেখায় যে আপনি কী ডেটা ব্যবহার করছেন, যাতে আপনাকে কোডটি কী করে তা আগে বের করে ডেটা টাইপটি বের করতে হবে না।


11

ইন্টেলিসেন্স এখন কতটা শক্তিশালী তা প্রদত্ত, আমি নিশ্চিত নই যে ক্লাসে সদস্য ভেরিয়েবল থাকা বা দৃশ্যমান স্ক্রিনের ক্ষেত্রের বাইরে সংজ্ঞায়িত কোনও পদ্ধতিতে স্থানীয় ভেরিয়েবলগুলি পড়ার চেয়ে ভার পড়ার পক্ষে আরও শক্ত।

আপনার যদি কোডের একটি লাইন থাকে

IDictionary<BigClassName, SomeOtherBigClassName> nameDictionary = new Dictionary<BigClassName, SomeOtherBigClassName>();

এর চেয়ে পড়া কি অনেক সহজ বা শক্ত:

var nameDictionary = new Dictionary<BigClassName, SomeOtherBigClassName>();

আমি আসলে এটি বিবেচনা করি নি, অন্য প্রশ্ন থেকে মনে হয় এটি ব্যবহার করার জন্য এটি অন্য এক সময়ের পক্ষে মোটামুটি শক্ত অবস্থান point
ফিঙ্গলাস

মূলত এগুলিই এটিকে বাস্তবায়িত করেছিল (বেনামে ধরণের নাম ঘোষণা করতে সক্ষম হওয়া ছাড়াও তারা "
বর্ণ

10

আমার মনে হয় ভিএআর-এর মূল বিষয়টি হ'ল এটি যথাযথভাবে ব্যবহার করা যেখানে লিন্কে এমন জিনিসগুলি করা হয় যা এটি সহজতর করে (এবং সম্ভবত অন্যান্য ক্ষেত্রেও)।

যদি আপনি পেয়েছেন কোনও কিছুর জন্য প্রকার তবে এটি ব্যবহার করা উচিত - এটি না করা সহজ অলসতা (সৃজনশীল অলসতার বিপরীতে যা সাধারণত উত্সাহিত করা হয় - ভাল প্রোগ্রামাররা অলস হতে খুব কঠোর পরিশ্রম করে এবং বিবেচনা করা যায়) প্রথম স্থানে জিনিসটির উত্স)।

একটি কম্বল নিষেধাজ্ঞা প্রথম স্থানে কনস্ট্রাক্টটিকে অপব্যবহারের মতোই খারাপ তবে একটি সংবেদনশীল কোডিং স্ট্যান্ডার্ড হওয়া দরকার।

অন্যান্য জিনিসটি মনে রাখবেন যে এটি কোনও ভিবি ধরণের বৈকল্পিক নয় কারণ এটি প্রকারগুলি পরিবর্তন করতে পারে না - এটি একটি দৃ strongly়ভাবে টাইপড ভেরিয়েবল কেবল তার টাইপটি অনুমান করা হয় (এই কারণেই এমন লোক রয়েছে যে যুক্তি দিবে যে এটি অযৌক্তিক নয় এটিকে ব্যবহার করুন, বলুন, একটি অগ্রণী তবে আমি পঠনযোগ্যতা এবং রক্ষণাবেক্ষণ উভয়ের কারণে একমত নই)।

আমি সন্দেহ করি যে এটি চালাচ্ছে এবং চালাচ্ছে (-:

Murph


10

অবশ্যই, intসহজ, তবে যখন ভেরিয়েবলের ধরণ হয় IEnumerable<MyStupidLongNamedGenericClass<int, string>>, var জিনিসগুলি আরও সহজ করে তোলে।


2
এই জন্য +1। intবনাম varহ'ল বিভ্রান্ত করার মতো বিষয়, তবে একাধিক নেস্টেড জেনেরিক ধরণের varএকটি গডসেন্ড তৈরি করে। এখানেই বারবার টাইপ নাম ব্যবহার করা কোডের পঠনযোগ্যতাকে ধ্বংস করে দেয়।
ক্রিস কৃষক

এটি একেবারে ব্যবহারের জন্য ভুল কারণ। যদি আপনার কোড কোনও নেস্টেড জেনেরিক প্রকার ব্যবহার করে তবে আপনার অবশ্যই এটির জন্য নির্দিষ্ট একটি বর্গ তৈরি করা উচিত। উদাহরণস্বরূপ: class IntStringEnumerator : IEnumerable<MyStupidLongNamedGenericClass<int, string>>এবং তারপরে নতুন নামটি ব্যবহার করুন। এটি কোড পরিষ্কার করে এবং প্রকারটি আরও ভালভাবে বর্ণনা করে।
xxbbcc

ঠিক আছে, তবে আমার উদাহরণটি কেবল হাইপারবোল ছিল। IntStringEnumerator i = new IntStringEnumerator()এখনও খুব বেশি টাইপ করা হয়।
ব্লগবার্ড

9

কোডিংহরারে এই ইস্যুতে পোস্ট থেকে চুরি হয়েছে :


দুর্ভাগ্যক্রমে, আপনি এবং অন্য সবাই একেবারে ভুল পেয়েছিলেন। যদিও আমি আপনার সাথে একমত হয়েছি যে অপ্রয়োজনীয়তা একটি ভাল জিনিস নয়, তবে এই সমস্যাটি সমাধানের আরও ভাল উপায় হ'ল নিম্নলিখিতগুলির মতো কিছু করা উচিত:

মায়োবজেক্ট মি = নতুন ();

বা যদি আপনি প্যারামিটারগুলি পার করছেন:

ব্যক্তি পি = নতুন ("প্রথম নাম", "শেষ নাম);

যেখানে কোনও নতুন অবজেক্ট তৈরি করার সময়, সংকলকটি ডানদিকে নয়, বাম-হাত থেকে প্রকারটি অনুমান করে। এর "ভের" এরও অন্যান্য সুবিধাগুলি রয়েছে, এটি ক্ষেত্রের ঘোষণায়ও এটি ব্যবহার করা যেতে পারে (এমন আরও কিছু ক্ষেত্র রয়েছে যা এটি কার্যকর হতে পারে তবে আমি এটি এখানে পাব না)।

শেষ পর্যন্ত, এটি কেবল অপ্রয়োজনীয়তা হ্রাস করার উদ্দেশ্যে নয়। আমাকে ভুল করবেন না, বেনামে টাইপ / প্রজেকশনগুলির জন্য সি # তে "ভার" খুব গুরুত্বপূর্ণ, তবে আপনি যে ধরণের অপ্রত্যাশিত হন সেহেতু এখানে ব্যবহারটি কেবলমাত্র বন্ধ (এবং আমি এটি দীর্ঘকাল ধরে বলছি) that ব্যবহৃত হচ্ছে. এটিকে দু'বার টাইপ করা খুব প্রায়ই হয় তবে শূন্য বার ঘোষণা করা খুব কম।

নিকোলাস পালডিনো। নেট / সি # এমভিপি 20 জুন, 2008 08:00 এএম


আমার ধারণা যদি আপনার প্রধান উদ্বেগটি কম টাইপ করতে হয় - তবে এটির ব্যবহার থেকে আপনাকে দমন করতে পারে এমন কোনও যুক্তি নেই।

আপনি শুধুমাত্র করতে যাচ্ছি যদি কখনো ব্যক্তি আপনার কোড এ দেখায়, তারপর যারা বজায় রাখে হবে? অন্যথায়, এই জাতীয় ক্ষেত্রে:

var people = Managers.People

এটি ঠিক আছে, তবে এরকম ক্ষেত্রে:

var fc = Factory.Run();

এটি শর্ট সার্কিটের যে কোনও তাত্ক্ষণিক ধরণের কাটা ছাড়াই আমার মস্তিষ্ক কোডের 'ইংরাজী' থেকে গঠন শুরু করতে পারে।

অন্যথায়, আপনার প্রকল্পে কাজ করতে পারে এমন লোকদের প্রতি কেবল আপনার সর্বোত্তম বিচার এবং প্রোগ্রামিং 'সৌজন্য' ব্যবহার করুন।


4
উপরের আপনার উদাহরণগুলি ভের ব্যবহার না করার জন্য একটি যুক্তি নয়; তারা ভাল বর্ণনামূলক পরিবর্তনশীল নাম ব্যবহার করার জন্য একটি যুক্তি। যদি [var fc = Factory.Run ();] এর পরিবর্তে আপনার [bool fc = Factory.Run ();] থাকে তবে কোডটি আরও পরিষ্কার হয়ে উঠবে না।
রায়ান লুন্ডি

9

varসুস্পষ্ট ধরণের পরিবর্তে ব্যবহার করা রিফ্যাক্টরিংগুলিকে অনেক সহজ করে তোলে (অতএব আমাকে অবশ্যই পূর্ববর্তী পোস্টারগুলির সাথে বিরোধিতা করতে হবে যার অর্থ এটি কোনও পার্থক্য রাখেনি বা এটি খাঁটি "সিনট্যাকটিক চিনি")।

যেখানে এই পদ্ধতিটি বলা হয় সেখানে প্রতিটি ফাইল পরিবর্তন না করেই আপনি আপনার পদ্ধতির রিটার্নের ধরণ পরিবর্তন করতে পারেন। কল্পনা করা

...
List<MyClass> SomeMethod() { ... }
...

যা ব্যবহার করা হয়

...
IList<MyClass> list = obj.SomeMethod();
foreach (MyClass c in list)
  System.Console.WriteLine(c.ToString());
...

আপনি যদি কোনওটি SomeMethod()ফেরত দেওয়ার জন্য চুল্লি করতে চান IEnumerable<MySecondClass>, আপনাকে পরিবর্তনশীল ঘোষণাটি পরিবর্তন করতে হবে (এর ভিতরেওforeach পদ্ধতিটি ব্যবহার করেছেন এমন প্রতিটি স্থানে আপনাকে ) ।

যদি লিখি

...
var list = obj.SomeMethod();
foreach (var element in list)
  System.Console.WriteLine(element.ToString());
...

পরিবর্তে, আপনি এটি পরিবর্তন করতে হবে না।


সম্মত হয়েছেন - ভাবছেন কেন এই দুর্দান্ত পার্শ্ব প্রতিক্রিয়াটিকে আরও কিছু জনপ্রিয় প্রতিক্রিয়াগুলির মধ্যে আরও সাবজেক্টিভ পেশাদারগুলির মতো দেখা হচ্ছে না।
ফিল্ডিংমেলিশ

এটা আজ আমার কাছে এসেছে। আমার একটি ফ্যাক্টরি ক্লাস রয়েছে যা মেইনমেনু ক্লাসের আইট্যান্স ফেরত দেয়। আজ আমি মেইনমেনুর একই ইন্টারফেস সহ একটি মেইনমেনু 2 তৈরি করেছি। পরিবর্তনের পরে আমার সমস্ত অ্যাপ কোডটি অচ্ছুত রয়েছে!
মার্কো স্টাফোলি

8

@ কাকু: একটি উদাহরণ কোড রিভিউ। আরেকটি উদাহরণ হ'ল দৃশ্যের পুনরুদ্ধার।

মূলত আমি আমার মাউস দিয়ে টাইপ-শিকারে যেতে চাই না। এটি উপলব্ধ নাও হতে পারে।


2
আপনি যে আকর্ষণীয় তা বলছেন কারণ ভ্যার রিফ্যাক্টরিংকে সহজতর করতে পারে। আপনি যদি ভের ব্যবহার করেছেন তবে আপনার দরকার নেই। এখন আপনি সর্বদা আইডিইর রিফ্যাক্টরিং সরঞ্জামগুলিতে নির্ভর করতে পারেন, তবে আপনি জানেন যে আপনি সর্বদা আইডিইতে টাইপের জন্যও নির্ভর করতে পারেন :)
ফ্রেড

8

এটা স্বাদের বিষয়। ভেরিয়েবলের ধরণ সম্পর্কে এই সমস্ত হট্টগোল অদৃশ্য হয়ে যায় যখন আপনি গতিশীলভাবে টাইপ করা ভাষা ব্যবহার করতে পারেন। এটি হ'ল, যদি আপনি কখনও তাদের পছন্দ করতে শুরু করেন (সবাই নিশ্চিত করতে পারেন তবে আমি নিশ্চিত নই, তবে আমি করব)।

সি # এর varদেখতে বেশ দুর্দান্ত যে এটি দেখতে ডায়নামিক টাইপিংয়ের মতো দেখায় , তবে আসলে এটি স্ট্যাটিক টাইপিং - সংকলকটি সঠিক ব্যবহার প্রয়োগ করে।

আপনার ভেরিয়েবলের ধরণটি আসলে তেমন গুরুত্বপূর্ণ নয় (এটি আগে বলা হয়েছিল)। এটি প্রাসঙ্গিক (অন্যান্য ভেরিয়েবল এবং পদ্ধতিগুলির সাথে এর মিথস্ক্রিয়া) এবং এর নাম থেকে তুলনামূলকভাবে পরিষ্কার হওয়া উচিত - গ্রাহক তালিকাতে এটি থাকা আশা করবেন না int...

আমি এখনও এই বিষয়ে অপেক্ষা করছি যে আমার বস এই বিষয়ে কী ভাবছেন - আমি একটি কম্বল "এগিয়ে যেতে" পেয়েছিলাম 3.5 তে কোনও নতুন নির্মাণ ব্যবহার করার জন্য, তবে রক্ষণাবেক্ষণ সম্পর্কে আমরা কী করব?


7

IEnumerable<int>এবং এর মধ্যে আপনার তুলনায় আপনার IEnumerable<double>চিন্তা করার দরকার নেই - আপনি যদি ভুল টাইপটি পাস করেন তবে আপনার কোড যেভাবেই সংকলন করবে না।

সেখানে প্রায় টাইপ-নিরাপত্তা কোন উদ্বেগের বিষয় varহল না গতিশীল। এটি কেবল যান্ত্রিক সংকলক এবং আপনার যে কোনও ধরণের অনিরাপদ কলগুলি ধরা পড়বে।

Var লিনকের জন্য একেবারে প্রয়োজন:

var anonEnumeration =
    from post in AllPosts()
    where post.Date > oldDate
    let author = GetAuthor( post.AuthorId )
    select new { 
        PostName = post.Name, 
        post.Date, 
        AuthorName = author.Name
    };

এখন ইন্টেলিজেন্সে অ্যানিউমেনারেশনটি দেখুন এবং এটির মতো কিছু উপস্থিত হবেIEnumerable<'a>

foreach( var item in anonEnumeration ) 
{
    //VS knows the type
    item.PostName; //you'll get intellisense here

    //you still have type safety
    item.ItemId;   //will throw a compiler exception
}

সি # সংকলকটি বেশ চালাক - পৃথকভাবে উত্পন্ন আননের ধরণের বৈশিষ্ট্যগুলি মিলে গেলে একই উত্পন্ন প্রকারটি থাকবে।

এর বাইরে, যতক্ষণ না আপনি ইন্টেলিজেন্স রেখেছেন ততক্ষণ যে varকোনও প্রসঙ্গে প্রসঙ্গটি স্পষ্টভাবে ব্যবহার করা ভাল good

//less typing, this is good
var myList = new List<UnreasonablyLongClassName>();

//also good - I can't be mistaken on type
var anotherList = GetAllOfSomeItem();

//but not here - probably best to leave single value types declared
var decimalNum = 123.456m;

IQueriable<T>পুনরাবৃত্তি করার আগে দয়া করে ছাড়ুন: anonEnumeration.ToList();
ডেভিড ডিয়েজ

@ ডেভিডডিজ আপনি কি পুনঃব্যবস্থা করতে পারবেন? আপনার বক্তব্য কোন মানে করে না। আমার কোড স্নিপেটের কোনও রেফারেন্স IQueryableবা.ToList()
কিথ

var anonEnumeration = from post in AllPosts() where post.Date > oldDate let author = GetAuthor( post.AuthorId ) select new { PostName = post.Name, post.Date, AuthorName = author.Name };একটি ফিরে না IQueriable<T>?
ডেভিড ডিয়েজ

1
@ ডেভিডডিজ এটি কী AllPosts()রিটার্নের উপর নির্ভর করে - প্রশ্নকারী জিজ্ঞাসা করে List<T>তাই আমি ধরে নিয়েছি। সেক্ষেত্রে ফলাফলটি anonEnumerationটাইপের হবে IEnumerable<'a>। এখন যদি এর পরিবর্তে AllPosts()রিটার্ন IQueryable<T>হয় তবে anonEnumerationহয়ে যাবে IQueryable<'a>( iক্যোয়ারেবল নোট নোট ) - তবে সেক্ষেত্রে আমার কোড এখনওIQueryable<T> কার্যকর করে কারণ কার্যকর হয় IEnumerable<T>। তাদের মধ্যকার পার্থক্য সম্পর্কে এখানে আরও ভাল প্রশ্নোত্তর রয়েছে - এখানে আমার কেসটি'avar কেসটি বেনামে রয়েছে এবং আপনাকে এটি একটি স্ট্যাটিকালি টাইপড ভেরিয়েবলের জন্য নির্ধারণ করতে দেয়।
কিথ

ওহ, আমি দেখতে পেয়েছি, এটি ব্যাখ্যা করার জন্য ধন্যবাদ :) আমার মন্তব্য ছিল কারণ একটিকে IQueryable<T>পুনরাবৃত্তি করা ভাল অভ্যাস নয় কারণ প্রতিটি পুনরাবৃত্তিতে আপনি ডিবিতে একটি পঠন বিবৃতি দিচ্ছেন। *.ToList() IQueryable<T>তাদের পুনরাবৃত্তি করার আগে অবশ্যই তা নিশ্চিত করুন
ডেভিড ডেজ

7

আমার ধারণা এটি আপনার দৃষ্টিভঙ্গির উপর নির্ভর করে। var"অপব্যবহার" এবং আমার সহকর্মীদের কারণে আমি ব্যক্তিগতভাবে কোনও কোডের টুকরা বুঝতে কোনও অসুবিধা পাইনি এবং আমি এটি পুরোপুরি বেশ ব্যবহার করি। (আমি স্বীকার করি যে ইন্টেলিসেন্স এ ক্ষেত্রে একটি বিশাল সহায়তা)

সর্বোপরি, যদি বিবৃতি পছন্দ করে

var index = 5; // this is supposed to be bad

var firstEligibleObject = FetchSomething(); // oh no what type is it
                                            // i am going to die if i don't know

সত্যিই এটি মোকাবেলা করা অসম্ভব, কেউ গতিশীল টাইপ করা ভাষা ব্যবহার করবেন না।


সম্ভবত নেট। 4 যেখানে গতিশীল প্রকারের সাধারণ জায়গা, এটি আরও গুরুত্বপূর্ণ হয়ে উঠবে?
কলিন ডেসমন্ড

2
বিপরীতে, আপনি যদি এখন "ভার" দ্বারা বিভ্রান্ত হন তবে আমি আশা করব যে আপনি "গতিশীল" দ্বারা অতিরিক্ত বিভ্রান্ত হবেন।
Anyoneশ্বর

আমি ডায়নামিক ডি = 52 এর মতো কিছু বুঝিয়েছি; var x = d; যা ভাল হতে হবে।
এমকিপিপি

7

আমি কেবল তখনই ব্যবহার করি যখন কোন ধরণের কী ব্যবহার করা হয় তা পরিষ্কার হয়ে যায়।

উদাহরণস্বরূপ, আমি এই ক্ষেত্রে বিভিন্ন ব্যবহার করব, কারণ আপনি অবিলম্বে দেখতে পাবেন যে এক্সটি "মাই ক্লাস" টাইপের হবে:

var x = new MyClass();

আমি এ জাতীয় ক্ষেত্রে ব্যবহার করব না, কারণ আপনাকে কোডের উপর দিয়ে মাউসটি টেনে আনতে হবে এবং কী ধরণের MyFunction ফিরে আসে তা দেখার জন্য টুলটিপটি দেখতে হবে:

var x = MyClass.MyFunction();

বিশেষত, আমি ডান দিকটি এমনকি কোনও পদ্ধতি নয় এমন ক্ষেত্রেও কখনও বৈচিত্র্য ব্যবহার করি না :

var x = 5;

(কারণ আমি বাইট, সংক্ষিপ্ত, ইনট বা অন্য যাই হোক না কেন সংকলক জানতে পারে না)


যদি ডান দিকে ব্যবহারের ন্যায্যতা স্পষ্ট যথেষ্ট নয় var, তবে varসমস্যা নয়: ডান দিকে সমস্যা। এটি যথেষ্ট বর্ণনামূলক নয় । Customer c = GetContext()হয় এখনও অস্পষ্ট এবং ব্যবহার চেয়ে ভাল var
জুলিয়ানআর

6

আমার কাছে, .NET- এ varদ্বিভাষিকতা কেন গুরুত্বপূর্ণ তা প্রতি অ্যান্টিপ্যাথি চিত্রিত করে। যে সি # প্রোগ্রামাররা ভিবি। নেটও করেছেন, তাদের সুবিধা varস্বজ্ঞাতভাবে সুস্পষ্ট। আদর্শ সি # এর ঘোষণা:

List<string> whatever = new List<string>();

এটি টাইপ করার ভিবি। নেট এ সমান,

Dim whatever As List(Of String) = New List(Of String)

যদিও ভিবি। নেট তে কেউ তা করে না। এটি মূর্খ হবে, কারণ .NET এর প্রথম সংস্করণ থেকে আপনি এটি করতে সক্ষম হলেন ...

Dim whatever As New List(Of String)

... যা ভেরিয়েবল তৈরি করে এবং এগুলি সমস্ত এক যুক্তিসঙ্গত কমপ্যাক্ট লাইনে আরম্ভ করে। আহ, তবে যদি আপনি একটি চান IList<string>না, একটি List<string>? ঠিক আছে, ভিবি। নেট এ এর ​​অর্থ হল আপনাকে এটি করতে হবে:

Dim whatever As IList(Of String) = New List(Of String)

ঠিক যেমন আপনাকে সি # তে করতে হবে এবং স্পষ্টতই এর varজন্য ব্যবহার করতে পারবেন না :

IList<string> whatever = new List<string>();

আপনার যদি টাইপটি কিছু আলাদা হওয়ার প্রয়োজন হয় তবে তা হতে পারে। তবে ভাল প্রোগ্রামিংয়ের অন্যতম মূল নীতি হ'ল অপ্রয়োজনীয়তা হ্রাস করা, এবং ঠিক এটিই ঘটে var


1
মজার বিষয় আপনি দ্বিভাষিকতাকে এমন কিছু হিসাবে উল্লেখ করেছেন যা ভের ব্যবহারকে উত্সাহ দেয়। ভের কীওয়ার্ডের প্রতি আমার বিরোধিতা সরাসরি জাভাস্ক্রিপ্টে আমার সাবলীলতা থেকে উদ্ভূত! :)
urig

varসি # varতে জাভাস্ক্রিপ্টের সাথে কোনও সংযোগ নেই । varসি # তে একটি- ঘোষিত ভেরিয়েবল দৃ strongly়-টাইপযুক্ত।
রায়ান লুন্ডি

6

বেনামি ধরণের জন্য এটি ব্যবহার করুন - এটি এখানে রয়েছে। অন্য যে কোনও কিছু ব্যবহার খুব দূরের। সি-তে বেড়ে ওঠা অনেক লোকের মতো আমিও এই ধরণের ঘোষণার বাম দিকে তাকিয়ে অভ্যস্ত। আমি না থাকলে ডান দিকের দিকে তাকাচ্ছি না। varযে কোনও পুরানো ঘোষণার জন্য ব্যবহার করা আমাকে সর্বদা তা করতে বাধ্য করে, যা আমি ব্যক্তিগতভাবে অস্বস্তি বোধ করি।

যারা বলছেন 'এটি কোনও বিষয় নয়, আপনি যা খুশি তা ব্যবহার করুন' পুরো ছবিটি দেখছেন না। প্রত্যেকেই এক পর্যায়ে বা অন্য সময়ে অন্য ব্যক্তির কোডটি গ্রহণ করবে এবং তারা এটি লেখার সময় যা কিছু সিদ্ধান্ত নিয়েছিল তা মোকাবেলা করতে হবে। মূলত বিভিন্ন নামকরণের কনভেনশন, বা - ক্লাসিক গ্রিপ - ব্র্যাকিং শৈলীর সাথে পুরো ' varবা না' জিনিসটি মিশ্রণ না করেই যথেষ্ট খারাপ । সবচেয়ে খারাপ পরিস্থিতি এমন হবে যেখানে একজন প্রোগ্রামার ব্যবহার করেনি varএবং তারপরে এমন একজন রক্ষণাবেক্ষণকারী আসে যিনি এটি পছন্দ করেন এবং কোডটি ব্যবহার করে এটি প্রসারিত করেন। সুতরাং এখন আপনি একটি অপরিষ্কার জগাখিচুড়ি আছে।

স্ট্যান্ডার্ডগুলি স্পষ্টতই একটি ভাল জিনিস কারণ তাদের অর্থ আপনি এলোমেলো কোড বাছাই করতে এবং এটিকে দ্রুত ছাঁটাইতে সক্ষম হওয়ার সম্ভাবনা অনেক বেশি। আরও বেশি জিনিস যা পৃথক হয়, তত কঠিন হয়। এবং 'সর্বত্র ভার' শৈলীতে স্থানান্তর করা একটি বড় পার্থক্য করে।

আমি ডায়নামিক টাইপ করতে আপত্তি করি না, এবং জড়িত টাইপিং - তাদের জন্য ডিজাইন করা ভাষায় আমি কিছু মনে করি না। আমি বেশ পাইথন পছন্দ করি। তবে সি # একটি স্ট্যাটিকালি স্পষ্টরূপে টাইপ করা ভাষা হিসাবে ডিজাইন করা হয়েছিল এবং এভাবেই এটি থাকা উচিত। বেনামে ধরণের বিধি ভঙ্গ করা যথেষ্ট খারাপ ছিল; লোকেরা এটিকে আরও আরও এগিয়ে নিয়ে যেতে এবং ভাষার মূর্খতাগুলি আরও বেশি ভাঙতে দেওয়া এমন কিছু যা আমি সন্তুষ্ট নই। এখন যে জিনিয়টি বোতল থেকে বেরিয়ে এসেছে, এটি আর ফিরে আসবে না C সি # শিবিরগুলিতে বल्कানাইজড হয়ে যাবে। ভাল না.


7
কি দারুন. এখন পর্যন্ত এই থ্রেডে উত্থাপিত সমস্ত যুক্তি উপেক্ষা করা এবং পুরো আলোচনাকে পুনরায় সেট করা একটি অর্জন is
কনরাড রুডল্ফ

এই 100% বর্ণনা করে যে আমি কীভাবে 'ভার' সম্পর্কে অনুভব করছি, বিশেষত কাউকে এলেস কোড বাছাইয়ের দৃষ্টিকোণ থেকে। ভেরের ব্যবহারটি যদি পুরো জায়গাগুলিতে লিখিত থাকে তবে তা কার্যত পরিবর্তন করে। +1
সাইমন

6

পরীক্ষার সময় অনেক সময়, আমি নিজেকে এই জাতীয় কোড দেখতে পেয়েছি:

var something = myObject.SomeProperty.SomeOtherThing.CallMethod();
Console.WriteLine(something);

এখন, কখনও কখনও, আমি দেখতে চাই যে সামোথার থিং নিজেই কী রয়েছে, সামোথার থিং একই ধরণের নয় যা কলমিথড () ফেরত দেয়। যেহেতু আমি যদিও বিভিন্ন ব্যবহার করছি, আমি কেবল এটি পরিবর্তন করেছি:

var something = myObject.SomeProperty.SomeOtherThing.CallMethod();

এটি:

var something = myObject.SomeProperty.SomeOtherThing;

ভের না করে, আমাকে বাম পাশে ঘোষিত প্রকারটিও পরিবর্তন করতে হবে। আমি জানি এটি গৌণ, তবে এটি অত্যন্ত সুবিধাজনক।


6

Afficionados যেগুলি varসময় বাঁচায় বলে মনে হয়, টাইপ করতে কম কীস্ট্রোক লাগবে:

StringBuilder sb = new StringBuilder();

চেয়ে

var sb = new StringBuilder();

আপনি যদি আমাকে বিশ্বাস না করেন তবে তাদের গণনা করুন ...

21 বনাম 21

আমি যদি তা করতে পারি তবে আমি তা ব্যাখ্যা করব, তবে কেবল এটি চেষ্টা করে দেখুন ... (আপনার ইন্টেলিজেন্সের বর্তমান অবস্থার উপর নির্ভর করে আপনাকে প্রত্যেকের জন্য আরও কয়েকটি লিখতে হতে পারে)

এবং এটি প্রতিটি ধরণের জন্য সত্য যা আপনি ভাবতে পারেন !!

আমার ব্যক্তিগত অনুভূতি হ'ল ভেরটি কখনই ব্যবহার করা উচিত নয় যেখানে প্রকারটি জানা যায় না কারণ এটি কোডে স্বীকৃতি হ্রাসযোগ্যতা হ্রাস করে। পুরো লাইনের চেয়ে টাইপটি সনাক্ত করতে মস্তিষ্ককে বেশি সময় লাগে। পুরানো টাইমাররা যারা মেশিন কোড এবং বিট বোঝে তারা ঠিক কী আমি কী সম্পর্কে বলছি তা জানে। মস্তিষ্ক সমান্তরালভাবে প্রক্রিয়া করে এবং আপনি যখন বিভিন্ন ব্যবহার করেন আপনি এটিকে তার ইনপুটটি সিরিয়াল করতে বাধ্য করেন। কেন কেউ তাদের মস্তিষ্ককে আরও কঠিন করে তুলতে চাইবে? কম্পিউটারগুলির জন্য এটিই।


আমি স্ট্রিংবিল্ডার sb = নতুন স্ট্রিংবিল্ডার () অগোছালো এবং স্পষ্টভাবে স্বীকৃতি পেতে এর পুনরাবৃত্তি খুঁজে পাই। এটা অতিরিক্ত গোলমাল। সমস্যাটি হ'ল, কিছু কোড বোঝার জন্য অতিরিক্ত বৌদ্ধিক প্রচেষ্টা কী করে এবং গঠন করে না তা নির্ধারণ করা বেশ বিষয়ভিত্তিক!
ljs

"টাইপটি যেখানে পরিচিত হয় না কেবল তা ছাড়া কখনও ব্যবহার করা উচিত নয় ..." - আপনি সংকলকটি যেমন টাইপটি সবসময় জানতে পারেন। এটি গতিশীল টাইপিং নয়, এটি কেবল সংকলকটি আপনাকে টাইপ নির্ধারণ করতে দেয়। তবে টাইপটি কখনই অজানা নয়।
গ্যাব্রিয়েল মাগানা

5

আমি সমস্ত জায়গাগুলিতে পৃথকভাবে বিভক্ত হয়েছি, আমার জন্য একমাত্র প্রশ্নবিদ্ধ স্থানগুলি হ'ল অভ্যন্তরীণ স্বল্প প্রকার, যেমন আমি int i = 3;বেশি পছন্দ করিvar i = 3;


5

এটি গতকাল আমি লিখেছি কোড থেকে অবশ্যই বিষয়গুলি সহজতর করে তুলতে পারে:

var content  = new Queue<Pair<Regex, Func<string, bool>>>();
...
foreach (var entry in content) { ... }

এটি ছাড়া চূড়ান্তভাবে ভার্জোজ হত var

সংযোজন: সত্যিকারের অনুক্রমের (উদাহরণস্বরূপ F #) ভাষার সাথে অল্প সময় ব্যয় করলে দেখাবে যে কীভাবে ভাল সংকলকগুলি সঠিকভাবে প্রকাশের ধরণটি পেতে পারেন at এটি অবশ্যই বোঝাতে চেয়েছে যে আমি varযতটা পারি ব্যবহার করতে ঝোঁক , এবং একটি স্পষ্টতাল টাইপ ব্যবহার করা এখন ইঙ্গিত দেয় যে ভেরিয়েবল আরম্ভের এক্সপ্রেশনের ধরণের নয়।


হ্যাঁ, সংকলকগুলি আমাদের চেয়ে বেশি স্মার্ট, এটি শেষ করুন!
বেনজল

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.