আমি এই কোডটি লিখছিলাম:
private static Expression<Func<Binding, bool>> ToExpression(BindingCriterion criterion)
{
switch (criterion.ChangeAction)
{
case BindingType.Inherited:
var action = (byte)ChangeAction.Inherit;
return (x => x.Action == action);
case BindingType.ExplicitValue:
var action = (byte)ChangeAction.SetValue;
return (x => x.Action == action);
default:
// TODO: Localize errors
throw new InvalidOperationException("Invalid criterion.");
}
}
এবং একটি সংকলন ত্রুটি পেয়ে অবাক হয়েছিল:
'কর্ম' নামে একটি স্থানীয় ভেরিয়েবল ইতিমধ্যে এই সুযোগে সংজ্ঞায়িত হয়েছে
এটি সমাধান করা খুব সহজ সমস্যা ছিল; দ্বিতীয়টি থেকে মুক্তি পেয়ে var
কৌশলটি করেছিলেন।
স্পষ্টতই case
ব্লকগুলিতে ঘোষিত ভেরিয়েবলগুলির পিতামাতার সুযোগ রয়েছে switch
তবে আমি কেন আগ্রহী তা জানতে আগ্রহী। প্রদত্ত যে C # এর মৃত্যুদন্ড অন্যান্য ক্ষেত্রে মাধ্যমে পড়া (এটা অনুমতি দেয় না প্রয়োজন break
, return
, throw
, অথবা goto case
যে শেষে বিবৃতি case
ব্লক), এটা বেশ অদ্ভুত বলে মনে হয় এটি পরিবর্তনশীল ঘোষণা সম্ভব হবে ভিতরে এক case
অন্য কোন ভেরিয়েবল সঙ্গে ব্যবহৃত বা দ্বন্দ্ব করা case
। অন্য কথায় ভেরিয়েবলগুলি case
স্টেটমেন্টের মাধ্যমে পতনের জন্য প্রদর্শিত হয় যদিও কার্যকর হতে পারে না cannot বিভ্রান্ত বা সহজে বা অপব্যবহার করা অন্য ভাষার কিছু নির্মাণ নিষিদ্ধ করে পাঠযোগ্যতার প্রচার করতে সি # প্রচুর ব্যথা নেয় takes এটি দেখে মনে হচ্ছে এটি বিভ্রান্তির কারণ মাত্র। নিম্নলিখিত পরিস্থিতিতে বিবেচনা করুন:
যদি এটিতে এটি পরিবর্তন করা হয়:
case BindingType.Inherited: var action = (byte)ChangeAction.Inherit; return (x => x.Action == action); case BindingType.ExplicitValue: return (x => x.Action == action);
আমি " আনসাইন করা স্থানীয় ভেরিয়েবলের ব্যবহার 'ক্রিয়া " পেয়েছি । এটি বিভ্রান্তিকর কারণ সি # তে থাকা প্রতিটি অন্যান্য নির্মাণে আমি
var action = ...
ভেরিয়েবলটি আরম্ভ করার কথা ভাবতে পারি , তবে এখানে এটি কেবল এটি ঘোষণা করে।আমি যদি কেসগুলিকে এভাবে পরিবর্তন করতে পারি:
case BindingType.ExplicitValue: action = (byte)ChangeAction.SetValue; return (x => x.Action == action); case BindingType.Inherited: var action = (byte)ChangeAction.Inherit; return (x => x.Action == action);
আমি " স্থানীয় ভেরিয়েবল 'অ্যাকশন' এটি ঘোষণার আগে ব্যবহার করতে পারি না "। সুতরাং কেস ব্লকের ক্রমটি এখানে এমনভাবে গুরুত্বপূর্ণ হিসাবে দেখা যাচ্ছে যা পুরোপুরি সুস্পষ্ট নয় - সাধারণত আমি এগুলি আমার ইচ্ছা অনুযায়ী যেভাবে লিখতে পারি, তবে যে
var
ব্লকটিaction
ব্যবহার করা হয় সেখানে অবশ্যই এটি উপস্থিত থাকতে হবে , তাইcase
ব্লকগুলি টুইঙ্ক করতে হবে সেই অনুযায়ী।যদি এটিতে এটি পরিবর্তন করা হয়:
case BindingType.Inherited: var action = (byte)ChangeAction.Inherit; return (x => x.Action == action); case BindingType.ExplicitValue: action = (byte)ChangeAction.SetValue; goto case BindingType.Inherited;
তারপরে আমি কোনও ত্রুটি পাই না, তবে এক অর্থে দেখে মনে হচ্ছে ভেরিয়েবলটিকে ঘোষণার আগে একটি মান নির্ধারিত করা হয়েছে।
(যদিও আপনি বাস্তবে এটি করতে চান এমন কোনও সময় আমি ভাবতে পারি না - আমিgoto case
আজকের আগেও জানতাম না )
সুতরাং আমার প্রশ্নটি হল, কেন সি # এর ডিজাইনাররা case
ব্লকগুলিকে তাদের নিজস্ব স্থানীয় সুযোগ দেয়নি ? এর কোনও historicalতিহাসিক বা প্রযুক্তিগত কারণ রয়েছে কি?
switch
পারি - আমি এই নকশার পিছনে যুক্তি সম্পর্কে কেবল আগ্রহী।
break
সি # তে সম্ভব নয়।
action
দেওয়ার আগে আপনার পরিবর্তনশীল ঘোষণা করুনswitch
, বা প্রতিটি কেসকে তার নিজস্ব ব্রেসেসে রাখুন, এবং আপনি বুদ্ধিমান আচরণ পাবেন।