সি # তে "ব্যক্তিগত" কীওয়ার্ড লেখার কোনও কারণ?


109

যতদুর আমি জানি, privateডিফল্ট সর্বত্র C # (অর্থাত যে যদি আমি লিখবেন না public, protected, internal, ইত্যাদি এটা হবে privateডিফল্টরূপে)। (আমি ভুল হলে আমাকে সংশোধন করুন।)

সুতরাং, কীওয়ার্ডটি লেখার কারণ কী বা এটি সদস্যদের জন্য কেন বিদ্যমান?

উদাহরণস্বরূপ, কোনও ইভেন্ট হ্যান্ডলার যখন স্বয়ংক্রিয়ভাবে উত্পন্ন হয় তখন এটিকে দেখে মনে হয়:

private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{

}

কেন এটি এমনকি ব্যক্তিগত লিখতে থাকে যদি তা অন্তর্ভুক্ত এবং ডিফল্ট হয়? ঠিক তাই নবজাতক বিকাশকারীরা (যারা এটি সি # ডিফল্ট জানেন না) তারা এটি ব্যক্তিগত জানেন? বা সংকলকটির জন্য কোনও পার্থক্য রয়েছে?

তদুপরি, "বেসরকারী" (একা) লিখলে সদস্যের অ্যাক্সেসযোগ্যতা পরিবর্তন হবে এমন কোনও মামলা আছে ?


18
আইআইআরসি, একটি "শীর্ষ স্তরের" প্রকারটি internalপূর্বনির্ধারিতভাবে হবে ।
জেফ মার্কাডো

4
প্রতিটি কিছুর জন্য পূর্বনির্ধারিতটি ব্যক্তিগত নয়, যেমনটি ইঙ্গিত করা হয়েছে, এবং থাম্বের সাধারণ নিয়ম হিসাবে এটি সুস্পষ্ট হওয়া ভাল।
জেমস মাইকেল হরে


সমস্ত কিছুর জন্য ডিফল্ট "যতটা সম্ভব ব্যক্তিগত"। স্পষ্টতই একটি অনিচ্ছাকৃত শ্রেণি ব্যক্তিগত হতে পারে না বা কিছুই এটিকে তাত্পর্যপূর্ণ বা ব্যবহার করতে পারে না। তবে সদস্যরা ডিফল্টরূপে ব্যক্তিগত এবং নেস্টেড ক্লাসগুলি ডিফল্টরূপে ব্যক্তিগত। সি # এর সমস্ত কিছুর মধ্যে ডিফল্টরূপে এটির সীমাবদ্ধ মাত্রার দৃশ্যমানতা থাকে।
রায়ান লুন্ডি

উত্তর:


171

আফাইক, ব্যক্তিগত সি # এর সর্বত্রই ডিফল্ট (অর্থাত্ আমি যদি সর্বজনীন, সুরক্ষিত, অভ্যন্তরীণ ইত্যাদি না লিখি তবে এটি ডিফল্টরূপে ব্যক্তিগত হবে)। (দয়া করে ভুল হলে আমাকে সংশোধন করুন)।

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

এছাড়াও,

সুতরাং, কীওয়ার্ডটি লেখার কারণ কী বা এটি কেন বিদ্যমান?

এটি স্পষ্টভাবে উল্লেখ করা ধরণটি খুব স্পষ্টভাবে প্রাইভেট করার আপনার উদ্দেশ্যটি বোঝাতে সহায়তা করে। এটি সময়ের সাথে সাথে আপনার কোডটি রক্ষণাবেক্ষণে সহায়তা করে। এটি অন্য বিকাশকারীদের (বা নিজেকে) সাহায্যে সদস্য কোনও ডিফল্টরূপে বা উদ্দেশ্য ভিত্তিতে প্রাইভেট কিনা তা জেনে সহায়তা করতে পারে etc.


1
@ ওয়েইন: জনের স্কিটের চেয়ে উচ্চতর স্কোর নিয়ে তার উত্তর আছে তবে সে এর যোগ্য নয় ... জনের উত্তরটি অনেক বেশি নির্ভুল।
aleroot

2
এটি অর্থহীন পার্থক্য। একটি নেমস্পেসের মধ্যে প্রকারগুলি ডিফল্টরূপে অভ্যন্তরীণ হয় কারণ তারা ডিফল্টরূপে ব্যক্তিগত হতে পারে না ; অন্যথায় কিছুই তাদের ব্যবহার করতে পারে না। এগুলি এখনও ডিফল্টরূপে তারা যথাসম্ভব সীমাবদ্ধ রয়েছে।
রায়ান লুন্ডি

1
ইনসিড ক্লাস এবং স্ট্রাক্টের জন্য ডিফল্ট সদস্যদের অ্যাক্সেসযোগ্যতা ব্যক্তিগত। : এখানে চেক করুন msdn.microsoft.com/en-us/library/ba0a1yw2(v=vs.90).aspx
Mitja Bonca

তবে একটি নেমস্পেসের ভিতরে থাকা উপাদানগুলি হতে পারে না private
শিমি ওয়েইজস্যান্ডলার

এছাড়াও, getএবং setসম্পত্তিটির অ্যাক্সেসযোগ্যতায় নিজেই ডিফল্ট
অস্টিন ডাব্লু ব্রায়ান

119

আফাইক, ব্যক্তিগত # সি এর সর্বত্রই ডিফল্ট

যথেষ্ট নয় - ডিফল্ট হ'ল "এই ঘোষণার জন্য সর্বাধিক সীমাবদ্ধ অ্যাক্সেস"। সুতরাং উদাহরণস্বরূপ, একটি শীর্ষ-স্তরের টাইপের সাথে ডিফল্ট হয় internal; নেস্টেড টাইপের জন্য ডিফল্ট হয় private

সুতরাং, কীওয়ার্ডটি লেখার কারণ কী বা এটি কেন বিদ্যমান?

এটি এটিকে স্পষ্ট করে তোলে যা দুটি কারণে ভাল:

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

আপনার শেষ অংশ হিসাবে:

তদুপরি এমন কোনও মামলা রয়েছে যেখানে "প্রাইভেট" (একা) লিখলে সদস্যের অ্যাক্সেসযোগ্যতা পরিবর্তন হবে?

হ্যাঁ, সম্পত্তির অর্ধেকটি অন্যের চেয়ে বেশি বিধিনিষেধযুক্ত করার জন্য:

// Public getter, public setter
public int Foo { get; set; }

// Public getter, private setter
public int Bar { get; private set; }

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

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


+1 টি। অর্থপূর্ণ অভিপ্রায় সিগন্যাল করতে অন্যথায়-অপ্রাসঙ্গিক কীওয়ার্ড ব্যবহার করা দরকারী, যদিও আমার জাভা ব্যাকগ্রাউন্ড finalআরও সাধারণ উদাহরণ ব্যবহার করে।
jprete

1
@ এমনিটেক: অন্যভাবে রাউন্ডটিও কার্যকর, তবে এটি কম কার্যকর। এগুলি সমস্ত সি # 2 তে চালু হয়েছিল
জন স্কিটি

20
আমি অবশ্যই চাই যে এখানে কোনও ডিফল্ট ছিল না এবং অ্যাক্সেস মডিফায়ারটি অনুপস্থিত থাকলে সংকলকটি কেবল একটি ত্রুটি ছুঁড়েছিল। আমি মনে করি না বেশিরভাগ লোকেরা প্রতিটি পরিস্থিতিতে ডিফল্টগুলি কী তা জানে যা এরপরে অনিচ্ছাকৃত ত্রুটি বাড়ে।

+1 "নেস্টেড টাইপের জন্য ডিফল্টটি বেসরকারী" - আমি আপনার উত্তরটি যখন পড়ি তখন আমি কেবল এ সম্পর্কে জানি। ধন্যবাদ!
নর্ডিন

5
@ ফং, সি # এর জন্য একটি সহজ নিয়ম রয়েছে: ডিফল্টরূপে, সবকিছু যতটা ব্যক্তিগত হতে পারে তেমন ব্যক্তিগত। একটি নেমস্পেসের আইটেম যেমন অ-নেস্টেড ক্লাসগুলি ব্যক্তিগত হতে পারে না, কারণ কিছুই এগুলি ব্যবহার করতে পারে না। এগুলি কেবল অভ্যন্তরীণ বা সর্বজনীন হতে পারে; সুতরাং ডিফল্ট হিসাবে, তারা অভ্যন্তরীণ। অন্যান্য জিনিসের অভ্যন্তরীণ জিনিসগুলি (শ্রেণীর মধ্যে এনাম; নেস্ট ক্লাস; বৈশিষ্ট্য; ক্ষেত্রসমূহ; পদ্ধতি ...) ডিফল্টরূপে ব্যক্তিগত।
রায়ান লুন্ডি

11

privateভিজ্যুয়াল বিশৃঙ্খলা যুক্ত করে। যাঁরা জোর দিয়ে বলেন যে এটি বিষয়গুলি সুস্পষ্ট করে তুলেছে, আমি তাদের জিজ্ঞাসা করব: আপনিও গণিত দিয়ে এটি করেন? এই ক্ষেত্রে:

var answer = a + b / c;

আপনি কি অপ্রয়োজনীয় প্রথম বন্ধনী ছাড়াই অস্পষ্ট দেখতে পান b / c?

সি # তে নিয়মটি খুব সহজ: ডিফল্টরূপে, সবকিছু যতটা বেসরকারী তার কাছাকাছি close সুতরাং আপনার যদি ডিফল্টর চেয়ে বেশি কিছু দৃশ্যমান হওয়ার প্রয়োজন হয় তবে একটি পরিবর্তনকারী যুক্ত করুন। অন্যথায়, আপনার কোডে অযথা কীওয়ার্ড যুক্ত করবেন না।


1
আমি প্রশ্ন জিজ্ঞাসা করার আগে এই অধিকারের সাথে একমত ছিলাম। তবে কিছু লোক ভিবি লিখেন, কিছু সি ++, কিছু এমনকি এফ # (অন্যান্য কার্যকরী ভাষা যেমন হাস্কেল সম্ভবত আসছে?), সি-এর চেয়ে আরও ভাল লেখেন। সুতরাং, তাদের জন্য (এবং যদি আমরা কোন সি # আইং এর 2 বছর পরে এটি ভুলে যাই তবে আমাদের পক্ষে) যদি অ্যাক্সেসরগুলি সুস্পষ্ট থাকে তবে এটি আরও ভাল। কোনও প্রকল্পে সহজ শিক্ষার প্রভাবকে অবমূল্যায়ন করবেন না, অনেক বিকাশকারী পটভূমি থেকে আসে যা পছন্দসই সরঞ্জামটি প্রতিফলিত করতে পারে না এবং প্রযোজনা কোডেও তাদের শেখার সহায়কগুলির প্রয়োজন হয়, এটি মোটেও খারাপ নয় (এবং আমরা অনেকগুলি জানি কোড খুব খারাপ সি #, সুতরাং কয়েকটি এইডস আমাদেরও সহায়তা করে)।
ক্যামিলো মার্টিন

3
ঠিক আছে, নিশ্চিত, ভিবিতে খেলাপিরা অত্যাচারী। আমি মনে করি ডিফল্ট দৃশ্যমানতা Friendসদস্যদের জন্য, উদাহরণস্বরূপ। সি # এর দৃশ্যমানতাটি সঠিকভাবে ডিফল্ট করে: জিনিসগুলি পরিবর্তন না করা হলে কমপক্ষে দৃশ্যমানতার পক্ষে সেট করা থাকে। আমি যেটি সন্ধান করতে পেরেছি তা থেকে এটি সি ++ (স্ট্রাক্ট ব্যতীত) একই ক্ষেত্রে সত্য। (এটি F # এর জন্য সত্য বলে মনে হচ্ছে না)
রায়ান লুন্ডি

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

2
আমি এমনকি এতদূর বিতর্ক করতে যে দর্শনীয় বিশৃঙ্খলা পাঠযোগ্যতা বাধা দেয় !
বিনকি

1
যদিও আপনার গণিতের উদাহরণের ক্ষেত্রে আমি প্রথম বন্ধনী ব্যবহার করতে পছন্দ করি না তা আপগোটেড ।
মার্চ ২৩7777

7

আমি যতদূর জানি, সি # তে সর্বত্র ব্যক্তিগত ডিফল্ট

স্পষ্টতই ব্যক্তিগতভাবে ঘোষণা করা , এর অর্থ এটি আপনি ব্যক্তিগত know এটি কেবল ভাবেন না, কারণ যতদূর আপনি জানেন এটি ডিফল্ট। এর অর্থ হ'ল কোডটি দেখে অন্য কেউ জানেন যে এটি কী।

কোন হল "আমার মনে হয় এটা হল", "আমি নিশ্চিত এটা আছি", ইত্যাদি এটা ঠিক নয় । এবং প্রত্যেকে একই পৃষ্ঠায় রয়েছে।

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

যখন বিষয়গুলি সুস্পষ্টভাবে সেট করা থাকে তখন আমি অপছন্দ করি। এটি কখনই পরিষ্কার হয় না যখন তারা স্পষ্টভাবে সেট হয়।


যুক্তিসঙ্গত শোনায়, আমি এমনকি ভাষাগুলির বেসিকগুলি ভুলে যাই যা আমি একবার আরও ভাল জানতাম।
ক্যামিলো মার্টিন

6

পঠনযোগ্যতা - সকলেই জানেন না যে ব্যক্তিগতটি ডিফল্ট আচরণ।

অভিপ্রায় - একটি স্পষ্ট ইঙ্গিত দেয় যে আপনি বিশেষভাবে সম্পত্তিটি ব্যক্তিগত হিসাবে ঘোষণা করেছেন (যে কোনও কারণে)।


5

পঠনযোগ্যতা, অভিপ্রায় প্রদর্শনের দুটি কারণ আমি ভাবতে পারি।


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

3

সুস্পষ্টভাবে দৃশ্যমানতা নির্দিষ্ট করার একটি ভাল কারণটি যাতে আপনি যে প্রসঙ্গে রয়েছেন তার ডিফল্ট কী তা নিয়ে আপনাকে ভাবতে হবে না।

আর একটি ভাল কারণ হ'ল FxCop আপনাকে এটি করতে বলে।


+1, আমি ঠিক এফএক্সকপ সম্পর্কে লক্ষ্য করেছি যে আমি যখন পরিবর্তনটি তৈরি করেছি তখন এখন প্রাইভেট মডিফায়ার সরানোর বিষয়ে অভিযোগ করেছিলাম।
ক্যামিলো মার্টিন

2

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


1
আচ্ছা, আমি বলব না "ডিফল্ট অ্যাক্সেস মডিফায়ার হ'ল private" হ'ল একটি ত্রুটিযুক্ত বিবরণ ... তবে আমি বিষয়টি বুঝতে পারি। অন্য দিন আমি গত সপ্তাহে ( এমইএফ ) যে কাঠামোটি ব্যবহার করেছি তা স্মরণে রাখতে সমস্যা হয়েছিল ।
কামিলো মার্টিন

0

আমি ক্লাসের বাকী অংশগুলির পাঠযোগ্যতার সাথে ধারাবাহিকতার জন্য বলতে চাই।


4
আপনি সি ++ এর কথা ভাবছেন। সি # তে, এমনকি স্ট্রাক্টগুলিতেও সদস্যরা ব্যক্তিগতভাবে ডিফল্ট হন।

3
স্ট্রাইকগুলির ডিফল্টরূপে জনসাধারণের অ্যাক্সেসযোগ্যতা থাকে না - দেখুন: এমএসডিএন.মাইক্রোসফটকম /en-us/library/ba0a1yw2.aspx
রিড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.