বেসরকারী সেট্টারগুলি বোঝা


94

আমি সি # 2 দিয়ে শুরু হওয়া ব্যক্তিগত সেটটারের প্রয়োজনীয়তা বুঝতে পারি না।

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

এটি আমার জন্য "এনক্যাপসুলেশন" ব্যবহার করছে। সেখানে কিছু যুক্তি রয়েছে যা দাবি করে যে ব্যক্তিগত সেটটারগুলি আপনাকে এনক্যাপসুলেশন প্রয়োগ করতে দেবে।

আমি কি পাবলিক সেটার পদ্ধতি ব্যবহার করে এনক্যাপসুলেশন ব্যবহার করছি না? আমাদের প্রাইভেট সেটার দরকার কেন?

অপরিবর্তনীয় শ্রেণি এবং বেসরকারী সেটারগুলির সাথে একটি শ্রেণীর মধ্যে পার্থক্য কী?


4
আমি প্রাইভেট সেটারগুলিকে বড় সময় পছন্দ করতাম - আমাকে পুনর্গঠিত কুরুচিপূর্ণ ক্লাসে সহায়তা করেছিল। তারা এটা ডিক্লেয়ার অসম্ভব এবং তাই মত একবারে একটি অ-ধ্রুবক উদাহরণস্বরূপ পরিবর্তনশীল সেট করুন: private File settingsFile = null;কনস্ট্রাকটর এবং তারপর এক: if (settingsFile == null) { settingsFile = GetSettingsFile() };। এরকম রিফ্যাক্টরিং কোড আমাকে মাঝে মাঝে কাঁদিয়ে তোলে :)। আপনি কেবল কনস্ট্রাক্টরের আগে কোনও সদস্য নির্ধারণ করতে পারেন, তার অর্থ এই নয় যে আপনার একাধিক কনস্ট্রাক্টরের সাথে হওয়া উচিত, এটি যুক্তিকে অনুসরণ করা খুব কঠিন করে তোলে। প্রাইভেট সেটার্স আপনাকে কনস্ট্রাক্টরের ভিতরে বা তার পরে মান নির্ধারণ করতে বাধ্য করে।
— হামিশ গ্রুবিজন

উত্তর:


270

যৌক্তিকভাবে।

একটি ব্যক্তিগত সেটারের উপস্থিতি হ'ল আপনি অটো সম্পত্তি ব্যবহার করতে পারেন:

public int MyProperty { get; set; }

আপনি এটিকে কেবল পাঠযোগ্য করে তৈরি করতে চাইলে আপনি কী করবেন?

public int MyProperty { get; }

ওহ বিষ্ঠা!! আমি নিজের ক্লাস থেকে এটি অ্যাক্সেস করতে পারি না; আমার এটিকে একটি সাধারণ সম্পত্তির মতো তৈরি করা উচিত:

private int myProperty;
public int MyProperty { get { return myProperty; } }

হুম ... তবে আমি "অটো সম্পত্তি" বৈশিষ্ট্যটি হারিয়েছি ...

public int MyProperty { get; private set; }

এএইচএইচএইচ .. এটি আরও ভাল !!


4
ধন্যবাদ এটি আবার অর্থবহ করে
— ডেন

4
@ কেটুতনিক আপনি যেভাবে কাজটি করেছেন তা প্রকাশ করার জন্য আপনাকে ধন্যবাদ। এটা এখন আমার কাছেও বোধগম্য হয়!
— বিবেক এম। চাওলা

4
চমত্কারভাবে সচিত্র উত্তর।
— imnk

4
Oh crap!! I can't access it from my own classসি # 6.0 শুরু করা এটি বাইরের আরম্ভের পর্যায়েই সত্য। আমার উত্তর দেখুন stackoverflow.com/a/34223746/198797
— tsemer

4
# টিসেমরের উত্তরে সি # 6 সহ যুক্ত করা {get; }সমতুল্য নয় { get; private set; }। প্রথম উপায়ে property.GetSetMethod(true)ফেরত nullএবং দ্বিতীয়টির জন্য true। এটি আমাকে অবাক করে দিয়েছে।
— এমরাগিনস

38

আপনার যদি কেবলমাত্র পঠনযোগ্য সম্পত্তি থাকে এবং স্পষ্টভাবে ব্যাকিং ভেরিয়েবলটি ঘোষণা করতে না চান তবে একটি প্রাইভেট সেটার কার্যকর।

সুতরাং:

public int MyProperty
{
    get; private set;
}

এটার মতই:

private int myProperty;
public int MyProperty
{
    get { return myProperty; }
}

অ অটো প্রয়োগিত বৈশিষ্ট্যের জন্য এটি আপনাকে আপনার শ্রেণীর মধ্যে থেকে সম্পত্তি সেট করার একটি ধারাবাহিক উপায় দেয় যাতে আপনার যদি বৈধকরণ ইত্যাদির প্রয়োজন হয় তবে আপনার কেবল এটির একটি জায়গা রয়েছে।

আপনার চূড়ান্ত প্রশ্নের উত্তর দিতে এমএসডিএন এর ব্যক্তিগত বেসরকারীদের উপর এই কথা বলতে হবে:

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

অটো প্রয়োগকারী বৈশিষ্ট্যগুলিতে এমএসডিএন পৃষ্ঠা থেকে


4
আমি দুঃখিত আমি ব্যক্তিগত সেটার থাকার কারণে যুক্ত হওয়া মানটি এখনও দেখতে পাচ্ছি না। আমরা যদি সেটারটিকে উন্মুক্ত করতে না চাই তবে আমাদের কেবল প্রাপ্তি রয়েছে। আমরা যদি বৈধকরণকারী যুক্ত করতে চাই তবে আমরা একটি সর্বজনীন সেটার রাখতে পারি এবং এতে বৈধতা যুক্ত করতে পারি। আমাদের অ্যাক্সেসযোগ্য নয় এমন একটি সেটার কেন দরকার? যেভাবে আমি এটি বুঝতে পেরেছি তা হল "এই গাড়িটি নিয়ে যান তবে আপনি এটিকে চালাতে পারবেন না" আমি যদি কোনওভাবে গাড়ি চালাচ্ছি না তবে আপনি আমাকে গাড়িটি কেন দিতে চান
— ডেন

@ ডেন - আপনি অবশ্যই এটি করতে পারেন, কারণ এটি ভুল নয়। স্বয়ংক্রিয়ভাবে প্রয়োগ করা সম্পত্তি থাকা বাধ্যতামূলক নয়।
— ক্রিসএফ

আমি জানি যেভাবে আমি এটি প্রকাশ করেছিলাম তেমন কোনও ভুল নেই। এটি কেবলমাত্র আমার জন্য সি # ২ দ্বারা তৈরি করা উন্নয়নমূলক প্রশংসা করার জন্য এটির চারপাশে প্রচুর হাইপ রয়েছে বলে মনে হয় তবে আমি এটি অনুভব করতে পারি না বা মানটি দেখতে পারি না।
— ডেন

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

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

18

এটা বরং সহজ। ব্যক্তিগত সেটটারগুলি আপনাকে কেবল পঠনযোগ্য পাবলিক বা সুরক্ষিত বৈশিষ্ট্য তৈরি করতে দেয়।

এটাই. এটাই একমাত্র কারণ।

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

এটি সত্য যে প্রাইভেট সেটারগুলি কেবলমাত্র স্বয়ংক্রিয়ভাবে প্রয়োগযোগ্য পঠন বৈশিষ্ট্যগুলির জন্য নির্দিষ্টভাবে তৈরি করা হয়নি, তবে অন্যান্য কারণগুলির জন্য তাদের ব্যবহারটি কিছুটা বেশি স্পষ্টতাই মূলত কেবলমাত্র পঠনযোগ্য বৈশিষ্ট্য এবং প্রতিবিম্ব এবং সিরিয়ালাইজেশনের ব্যবহারকে কেন্দ্র করে।


4
ধন্যবাদ "যদি আপনি চান একটি স্বতঃ-বাস্তবায়িত সম্পত্তি কেবল পঠনযোগ্য হয়, আপনাকে অবশ্যই ব্যক্তিগত সেটটার ব্যবহার করতে হবে"। এটি আমার কাছে বোধগম্য হয়
— ডেন

18

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

এই নতুন বাক্য গঠন এখন সংকলন:

ইনলাইন প্রারম্ভিক সম্পত্তি

public class MyClass1 {
  public string MyProperty { get; } = "Aloha!"
}

কনস্ট্রাক্টর প্রারম্ভিক সম্পত্তি

public class MyClass2 {
  public string MyProperty { get; }

  public MyClass2(string myProperty) {
    MyProperty = myProperty;
  }
}

4
@ জিগলার, আসলে তা হয় না। না ওপি এটি জিজ্ঞাসা করে না। সে কেবল তাদের থাকার প্রয়োজন বুঝতে পারে না। এটির উত্তর: "আপনার এই দৃশ্যে আর থাকতে হবে না"।
— tsemer

6

আমি সি # 2 দিয়ে শুরু হওয়া ব্যক্তিগত সেটটারের প্রয়োজনীয়তা বুঝতে পারি না।

উদাহরণস্বরূপ, চালান শ্রেণি ব্যবহারকারীর আইটেম সম্পত্তি থেকে আইটেম যুক্ত বা সরাতে দেয় তবে এটি ব্যবহারকারীর আইটেম রেফারেন্স পরিবর্তন করতে দেয় না (যেমন, ব্যবহারকারী আইটেমের সম্পত্তি অন্য আইটেম তালিকার অবজেক্টের উদাহরণে বরাদ্দ করতে পারে না)।


public class Item
{
  public string item_code;
  public int qty;

  public Item(string i, int q)
  {
    this.item_code = i;
    this.qty = q;
  }
}

public class Invoice
{
  public List Items { get; private set; }

  public Invoice()
  {
    this.Items = new List();
  }
}

public class TestInvoice
{
  public void Test()
  {
    Invoice inv = new Invoice();
    inv.Items.Add(new Item("apple", 10));

    List my_items = new List();
    my_items.Add(new Item("apple", 10));

    inv.Items = my_items;   // compilation error here.
  }
}

+1 হাইলাইট করার জন্য সম্পত্তিগুলি পাবলিক গেটারের মাধ্যমে তাদের ব্যক্তিগত বেসরকারী থাকা সত্ত্বেও কারসাজি করা যায়।
— ব্যবহারকারী 1725145

4

উদাহরণস্বরূপ বলুন, আপনি সম্পত্তিটির মাধ্যমে প্রকৃত পরিবর্তনশীল সঞ্চয় করবেন না বা কোনও কিছু গণনা করার জন্য মানটি ব্যবহার করবেন না।

সেক্ষেত্রে আপনি হয় আপনার গণনা করার জন্য একটি পদ্ধতি তৈরি করতে পারেন

private void Calculate(int value)
{
 //...
}

অথবা আপনি এটি ব্যবহার করে করতে পারেন

public int MyProperty {get; private set;}

এই ক্ষেত্রে আমি পরে ব্যবহার করার জন্য সুপারিশ করব, সম্পত্তি সদস্য হিসাবে প্রতিটি সদস্য উপাদান অক্ষত।

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

public int myprop;
public int MyProperty {get { return myprop;}}

... ...

this.myprop = 30;

... ...
if(this.MyProperty > 5)
   this.myprop = 40;

উপরের কোডটি ভয়াবহ দেখাচ্ছে কারণ প্রোগ্রামার মাইপ্রোপার্টি গেট ফর মেট্রোপেট এবং সেট এর জন্য মাইপ্রপ ব্যবহার করতে সর্বদা সতর্ক হওয়া দরকার।

ধারাবাহিকতার জন্য পুনরায় আপনি একটি প্রাইভেট সেটার ব্যবহার করতে পারেন যা প্রপোর্টিটিকে কেবলমাত্র পঠনযোগ্য করে তোলে যখন আপনি নিজের কোডের ভিতরে সেটারটি ব্যবহার করতে পারেন।


3

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


2

এনক্যাপসুলেশন বলতে বোঝায় যে কোনও সামগ্রীর অবস্থা কেবলমাত্র একটি সংজ্ঞায়িত ইন্টারফেসের মাধ্যমে ঘটে এবং এর ফলে শ্রেণি নিশ্চিত করতে পারে যে এই রাজ্যটি সর্বদা বৈধ এবং শ্রেণীর উদ্দেশ্যকে মেনে চলা যায়।

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

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

অন্যান্য ক্ষেত্রে, অন্য ভাষাগুলিতে, একজনের গেটর এবং সেটার পদ্ধতি থাকবে, যা কিছু int getId()মূল্য পেতে এবং void setId(int val)এটি আপডেট করার মতো।

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

(প্রকৃতপক্ষে, প্রতিবিম্বটি যেভাবে কাজ করে এবং DataBinder.Evalক্ষেত্রটি ঠিকঠাক কাজ করার পরেও কোনও সম্পত্তি রাখতে সুবিধাজনক হতে পারে তার কারণেই, তবে এটি অন্য বিষয়))।

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

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

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

  1. একটি ক্লাসের সমস্ত উদাহরণ ক্ষেত্রের readonly, তাই ব্যক্তিগত কোড এমনকি এটি পরিবর্তন করতে পারে না। এটি স্থাবর হওয়ার গ্যারান্টিযুক্ত (যে কোনও কিছু এটির পরিবর্তনের চেষ্টা করে তা সংকলন করবে না) এবং সম্ভবত এর পিছনে অপ্টিমাইজেশন করা যেতে পারে।

  2. কোনও শ্রেণি বাইরে থেকে অপরিবর্তনীয় কারণ কোনও জনসাধারণের সদস্য কিছু পরিবর্তন করে না, তবে readonlyঅভ্যন্তরীণ দিক থেকে পরিবর্তন না করা ব্যবহারের মাধ্যমে গ্যারান্টিযুক্ত নয়।

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


1

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


1

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

অপরিবর্তনীয় শ্রেণি হ'ল এমন একটি শ্রেণি যা এটি তৈরি হওয়ার পরে পরিবর্তিত হয় না, তাই ব্যক্তিগত সুরক্ষিত সংস্থাগুলি (বা কোনও সেটটার মোটেই নেই) বৈশিষ্ট্যগুলি রক্ষার জন্য প্রয়োজন।

প্রাইভেট সেটাররা সম্পত্তি # শর্টহ্যান্ডের সাথে ঘন ঘন ব্যবহারে আসেন যা সি # 3 তে প্রবর্তিত হয়েছিল সি সি 2 2-এ সেটারটি প্রায়শই কেবল বাদ দেওয়া হত এবং সেট করার সময় ব্যক্তিগত ডেটা সরাসরি অ্যাক্সেস করা হত।

এই সম্পত্তি:

public int Size { get; private set; }

এটার মতই:

private int _size;
public int Size {
  get { return _size; }
  private set { _size = value; }
}

ব্যাকিং ভেরিয়েবলের নামটি অভ্যন্তরীণভাবে সংকলক দ্বারা তৈরি করা হয়েছে, সুতরাং আপনি সরাসরি এটি অ্যাক্সেস করতে পারবেন না।

শর্টহ্যান্ড সম্পত্তি সহ প্রাইভেট সেটারকে কেবল পঠনযোগ্য সম্পত্তি তৈরি করার প্রয়োজন হয়, কারণ আপনি সরাসরি ব্যাকিং ভেরিয়েবলটি অ্যাক্সেস করতে পারবেন না।


আমি যদি সঠিকভাবে স্মরণ করি তবে সি # ২.০ এর আগে getএবং এর setআগে আপনার আলাদা আলাদা অ্যাক্সেস মডিফায়ার থাকতে পারে না । এছাড়াও, আমি মনে করি যে আপনি স্বতঃ-প্রয়োগিত শর্টহ্যান্ড হিসাবে উল্লেখ করেছেন আপনি 3.0 এবং 3.0 মিশ্রিত করছেন was.০
— অ্যান্টনি পেগ্রাম

1

আমি সি # 2 দিয়ে শুরু হওয়া ব্যক্তিগত সেটটারের প্রয়োজনীয়তা বুঝতে পারি না।

কেস উদাহরণ ব্যবহার করুন:

আমার কাছে এমন একটি অ্যাপ্লিকেশন অবজেক্টের উদাহরণ 'UserInfo'রয়েছে যাতে এমন একটি সম্পত্তি রয়েছে SessionTokenIDV1যা আমি আমার শ্রেণীর গ্রাহকদের কাছে প্রকাশ করতে চাই না।

আমার ক্লাস থেকে সেই মান সেট করার দক্ষতাও আমার দরকার।

আমার সমাধানটি ছিল দেখানো হিসাবে সম্পত্তিটি encapsulate করা এবং সেটারটিকে ব্যক্তিগত করা যাতে আমি তাত্ক্ষণিক কোডটি সেট করার অনুমতি না দিয়ে সেশন টোকেনের মান সেট করতে পারি (বা এমনকি আমার ক্ষেত্রে এটি দেখতেও)

public class UserInfo
{
   public String SessionTokenIDV1 { get; set; }

}


public class Example
{
  // Private vars
  private UserInfo _userInfo = new UserInfo();

  public string SessionValidV1
  {
    get { return ((_userInfo.SessionTokenIDV1 != null) && (_userInfo.SessionTokenIDV1.Length > 0)) ? "set" : "unset"; }
    private set { _userInfo.SessionTokenIDV1 = value; }
  }
}

সম্পাদনা: স্থির কোড ট্যাগ সম্পাদনা: উদাহরণে ত্রুটি ছিল যা সংশোধন করা হয়েছে


-1

Https://www.dotnetperls.com/property- তে ক্রেডিট ।

ব্যক্তিগত সেটটারগুলি কেবল পঠনযোগ্য ক্ষেত্রের মতো। এগুলি কেবল কনস্ট্রাক্টরে সেট করা যায়। আপনি বাইরে থেকে সেট করার চেষ্টা করলে আপনি সংকলনের সময় ত্রুটি পান।

public class MyClass
{
    public MyClass()
    {
        // Set the private property.
        this.Name = "Sample Name from Inside";
    }
     public MyClass(string name)
    {
        // Set the private property.
        this.Name = name;
    }
    string _name;
    public string Name
    {
        get
        {
            return this._name;
        }
        private set
        {
            // Can only be called in this class.
            this._name = value;
        }
    }
}

class Program
{
    static void Main()
    {
        MyClass mc = new MyClass();
        Console.WriteLine(mc.name);

        MyClass mc2 = new MyClass("Sample Name from Outside");
        Console.WriteLine(mc2.name);
    }
}

আমি যখন ক্লাসের বাইরে থেকে সেট করার চেষ্টা করেছি তখন দয়া করে নীচের স্ক্রিন শটটি দেখুন।

এখানে চিত্র বর্ণনা লিখুন

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