আপনি কখন "এই" কীওয়ার্ডটি ব্যবহার করবেন? [বন্ধ]


249

আমি কিভাবে অন্য মানুষ ব্যবহার সম্পর্কে জানতে আগ্রহী ছিল এই শব্দ। আমি এটি কনস্ট্রাক্টরগুলিতে ব্যবহার করার প্রবণতা রাখি, তবে আমি অন্যান্য পদ্ধতিতে ক্লাসেও এটি ব্যবহার করতে পারি। কিছু উদাহরণ:

একজন কনস্ট্রাক্টরে:

public Light(Vector v)
{
    this.dir = new Vector(v);
}

অন্যত্র

public void SomeMethod()
{
    Vector vec = new Vector();
    double d = (vec * vec) - (this.radius * this.radius);
}

2
আপনার সত্যিই this এমএসডিএন-এ যখন দরকার তখন আমি ভাল উদাহরণ পেয়েছি । দয়া করে এই লিঙ্কটি অনুসরণ করুন ... ;-)
ম্যাট

12
আপনি যদি অন্য কাউকে বুঝতে ও অপ্টিমাইজ করতে বা পুনরায় লেখতে চান তবে বেশিরভাগ খারাপভাবে লিখিত কোডটি পেয়ে আপনি thisবা অন্য কোনও যোগ্যতা অর্জন করতে পেরে খুশি হবেন যাতে সরল চেহারা থেকে আপনি ভেরিয়েবলের সুযোগ জানতে পারবেন (বিশেষত ধ্রুবকগুলির জন্য বাদ দেওয়া শ্রেণীর বাছাইকারী (একই প্যাকেজ বা হায়ারার্কি) বা super/ baseকোয়ালিফায়ার)। এবং সাধারণত ব্যবহৃত সিনট্যাক্সের মতো _fooব্যবহার করা আমার কাছে এটি মার্জিত বলে মনে হয় না। _ইন্টেলিজেন্সের জন্য চাপ দেওয়া প্রবেশের চেয়ে বেশি সময় সাশ্রয়ী this। আর আদৌ বিরক্ত কেন! _আপনি যদি কোয়ালিফায়ারকে ভুলে যান তবে গ্রহটি অটো-সেভ ফর্ম্যাটিং ফাংশনগুলির সাথে প্রয়োজন নেই ।
ডিজেএমজে

নিচে উত্তর এবং মন্তব্য পড়া, সেইসাথে MSDN ডকুমেন্টেশন পড়ার পর: docs.microsoft.com/en-us/previous-versions/visualstudio/... উপর এই শব্দ করেছে যে 6 বছর আপডেট করা হয়নি, আমি সুপারিশ করবে এই কীওয়ার্ডটি কখনও ব্যবহার না করার জন্য । এটা অর্থহীন. প্যারামিটারগুলি একই নামে তৈরি করবেন না, এটি বিভ্রান্তিকর এবং বোকা। তুমি ওটা কেন করবে? এছাড়াও, ব্যবহারে উদাহরণস্বরূপ পাস না এই , এটি বিভ্রান্তিকর এবং নির্বোধ হচ্ছে।
Yusha

উত্তর:


218

সি # তে এই কীওয়ার্ডটির বেশ কয়েকটি ব্যবহার রয়েছে ।

  1. একই নামে গোপন সদস্যদের যোগ্যতা অর্জনের জন্য
  2. একটি অবজেক্টকে অন্য প্যারামিটার হিসাবে অন্য পদ্ধতিতে পাস করার জন্য
  3. কোনও বস্তুটি কোনও পদ্ধতি থেকে নিজেই ফিরে আসে
  4. সূচক ঘোষণা করতে
  5. এক্সটেনশন পদ্ধতিগুলি ঘোষণা করতে
  6. কনস্ট্রাক্টরগুলির মধ্যে পরামিতিগুলি পাস করতে
  7. অভ্যন্তরীণভাবে মান টাইপ (স্ট্রাক্ট) মানটি পুনরায় নির্ধারণ করতে
  8. বর্তমান দৃষ্টান্তে একটি এক্সটেনশন পদ্ধতিটি চাওয়ার জন্য
  9. নিজেকে অন্য ধরণের কাস্ট করতে
  10. একই শ্রেণিতে সংজ্ঞায়িত নির্মাতাদের কাছে

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


49
৮. বর্তমান উদাহরণে একটি এক্সটেনশন পদ্ধতিটি আহ্বান করা ( this.Foo();কাজ Foo()করবে তবে কার্যকর হবে না)
মার্ক গ্র্যাভেল

4
এছাড়াও নিজেকে অন্য ধরণের কাস্ট করতে, উদাহরণস্বরূপ একটি স্পষ্টভাবে প্রয়োগকৃত পদ্ধতিটিকে বলা হবে ((ICollection<T>)this).Add(bla)
নওফাল

4
একই ধরণের সংজ্ঞায়িত অন্য নির্মাণকারীকে নির্মাণের চেইন করতে। public ClassName(...) : this(...)
লাসে ভি কার্লসেন

1
@ তবে এটি রান সময় সময়ে পারফরম্যান্সকে প্রভাবিত করবে না। ধরে নেই যে কোনও দ্বিধাগ্রস্ততা নেই, সংকলকটির আউটপুট আপনি লেখেন কিনা তা নির্বিশেষে একই, উদাহরণস্বরূপ this.someField = someValueবা someField = someValue। এটি সংকলকটির কার্য সম্পাদনকে প্রভাবিত করতে পারে, যেহেতু সংকলক উত্স কোডটি আলাদাভাবে বিশ্লেষণ করবে তবে কোনও পার্থক্য অবশ্যই নগণ্য হবে।
ফুগ

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

246

আমি এটিকে স্পর্শকাতর শব্দ বলতে চাইছি না, তবে এটি কোনও ব্যাপার নয়।

সিরিয়াসলি।

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

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

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


35
মূল thisশব্দটি শব্দার্থত অর্থবোধক। নীচে @ জেসনবন্টিংয়ের মন্তব্য দেখুন। আপনি শৈলীগত অত্যধিক ব্যবহারকে thisএর আসল উদ্দেশ্য নিয়ে বিভ্রান্ত করেন । আপনার মন্তব্যটি কেবল উল্টো নয়, এটি ভুল!
ড্যান বারোই

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

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

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

4
আমি মনে করি আপনি আমার বক্তব্য ভুল বুঝতে পারে। এটি "ধারাবাহিক স্টাইল থাকা" খারাপ ছিল না। আমি সেই প্রভাবকে কিছুই বলি না। এটি হ'ল "আমার শৈলীর নির্দেশনাটি এই উচিত" এর অপশন প্রশ্ন। সমস্ত ক্ষেত্রের অ্যাক্সেসের উপসর্গ হিসাবে? " নির্বিচারে এবং কৌতুকপূর্ণ।
স্কট উইসনিউস্কি

96

আমি একেবারে যখন প্রয়োজন হয় তখনই এটি ব্যবহার করি, যখন অন্য ভেরিয়েবল অন্যটি ছায়াযুক্ত করে। যেমন এখানে:

class Vector3
{
    float x;
    float y;
    float z;

    public Vector3(float x, float y, float z)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }

}

বা রায়ান ফক্স যেমন উল্লেখ করেছে, যখন আপনাকে এটি প্যারামিটার হিসাবে পাস করতে হবে। (স্থানীয় ভেরিয়েবলের সদস্য ভেরিয়েবলের চেয়ে প্রাধান্য রয়েছে)


6
এই ক্ষেত্রে কেন কেবল কনস্ট্রাক্টরের ইনপুট ভেরিয়েবলগুলিকে আলাদা আলাদা নাম দেওয়া যায় না?
wz366

54

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


9
তবে আপনি যদি এটির কিছুক্ষণ ব্যবহার করতে ভুলে যান তবে তারা বিভ্রান্ত হয়ে
পড়বেন

2
@ সুরফেন যা অতিরিক্ত স্টাইলের চেকগুলি এড়ানো যায়, যেমন জাভাতে আপনি চেকস্টাইল ব্যবহার করতে পারেন এবং এটি পুরো বিল্ডের পরে চালাতে পারেন (এবং যে কোনও জনপ্রিয় পুনরাবৃত্ত / ওও ভাষায় একই ধরণের সরঞ্জাম পাওয়া যাবে)
মার্টেন বোদেউয়েস

5
@ সুরফেনকে যেন আপনি অস্পষ্ট ক্ষেত্রে ভুলে যান। "তবে আপনি যদি ভুলে যান ..." বলে আমি কোনও যুক্তি ভঙ্গ করতে পারি।
আসকোলইন

6
বেশিরভাগ লোকের মনে হয় না যে তারা অন্য কারও কোডটি কখনও পড়েনি, অনুকূলিত করবে বা পুনর্লিখন করবে! বাছাইপর্বগুলি সময় এবং প্রেরণার সেভার! আপনি যদি কোনও যেকোন স্বেচ্ছাসেবীর লাইন দেখতে পান তবে কোয়ালিফায়ার ছাড়াই এর মতো যাদু। সুতরাং আপনি সমস্ত সময় নষ্ট করেন যেখানে এই ভেরিয়েবলগুলি আসে check
djmj

3
আমি জানি এটি একটি পুরানো পোস্ট, তবে কেবল এই উত্তরটির ব্যঙ্গাত্মক বিষয়ে মন্তব্য করতে সহায়তা করতে পারে না (যার সাথে আমি একমত হতে পারি)। দুষ্টু হাঙ্গেরিয়ান নোটেশনের বিরুদ্ধে জিহাদে, যে কেউ তার সদস্য ভেরিয়েবলগুলিকে "এম_" দিয়ে উপসর্গ করার সাহস করেছিল তাকে দ্রুত পিলারযুক্ত করা হয়েছিল কারণ সদস্য ভেরিয়েবলগুলি পার্থক্য করা কেবল দরকারী বা প্রয়োজনীয় ছিল না।
মাইকেল জে

38

আমি যখনই প্রয়োজন না পড়ি ততবারই আমি উদাহরণের পরিবর্তনশীল উল্লেখ করি use আমি মনে করি এটি কোডটিকে আরও স্পষ্ট করে তোলে।


আমি যতটা পারি ক্লাসের ভেরিয়েবলগুলিকে আলাদা করতে চাই, তাই কোড আরও স্পষ্ট। আমি উপসর্গ এম_ (সদস্য ভেরিয়েবল) যেমন ব্যক্তিগত স্ট্রিং এম_নাম ব্যবহার করতাম use এখন আমি কেবল এটি ব্যবহার করি যেমন আমার কাছে ক্লাস টেস্ট {ব্যক্তিগত স্ট্রিং এ; সর্বজনীন someMethod () {this.a = "foo"; }}
ব্রডব্যান্ড

36

আমি সব লোককে বিশ্বাস করতে পারি না যারা বলে যে এটি সর্বদা ব্যবহার করা একটি "সেরা অনুশীলন" এবং এরকম।

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

সম্পাদনা: "এটি" সংক্রান্ত সি # ডকুমেন্টেশনগুলি "এই" কীওয়ার্ডের জন্য - " সূচকগুলি ঘোষণার জন্য " উল্লেখ করা দুটি ছাড়াও আরও একটি ব্যবহারের ইঙ্গিত দেয়

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


21
@ জেসনবুন্টিং : আপনি কখনও কখনও কিছু করতে পারবেন না এবং অন্য কিছু নয় ... এটি বিভ্রান্তিকর ... আমি আশা করি আমি আপনার কোডে কখনও কাজ করব না আপনি ভবিষ্যতে সবসময় ধরে নিতে পারবেন না যে ভবিষ্যতে আপনার কোডটি পড়েন এমন ব্যক্তি আপনাকে কী বুঝতে পারে লিখেছিলেন, আপনি যতটা সম্ভব পরিষ্কার, এবং এক উপায় এটা অর্জন করা যেমন দরকার সামঞ্জস্যপূর্ণ হতে হয়
জুয়ান

@ জুয়ান, 10 বছর পরে। আপনি এখনও ভাবেন "এটি" ব্যবহার করা কি ভাল অনুশীলন? :)
স্কট অ্যাডামস

2
আমি এখনও, হ্যাঁ দৃঢ়তা এবং স্বচ্ছতার বিশ্বাস @ScottAdams
জুয়ান

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

27

আমি যখনই স্টাইলকপ আমাকে বলে তখন তা ব্যবহার করি । স্টাইলকপ অবশ্যই মানতে হবে। হ্যাঁ.


1
এবং রিশার্পার আমাকে এটি ব্যবহার না করার জন্য বলে। আমি একই সাথে স্টাইলকপ এবং রিশার্পার উভয়টিই যখন ব্যবহার করছি তখন বিভ্রান্ত হওয়ার মতো :) তবে আমি উপরের কোরিসের উত্তরগুলিতে ঝুঁকেছি, যখন একেবারে প্রয়োজন হয় তখনই 'এই' কীওয়ার্ডটি ব্যবহার করতে পারি।
গুনার

@ গুন্নার, "এটিকে" অপ্রয়োজনীয়তা থেকে মুক্তি নিষ্ক্রিয় করার একটি বিকল্প রয়েছে। আর # তে
উইঙ্গার সেনডন

@ এমপায়ারএমন - হ্যাঁ, আমি জানি। আমার বক্তব্যটি ছিল যে এই দুটি জনপ্রিয় ফর্ম্যাটিং সরঞ্জামগুলি ডিফল্টরূপে দুটি পৃথক বিষয় প্রস্তাব করে এবং তা বিভ্রান্তিকর হতে পারে। "হতে হবে বা হবে না ..." :)
গুনার

11

যে কোনও সময় আপনার বর্তমান অবজেক্টের একটি রেফারেন্স প্রয়োজন।

আপনার অবজেক্ট কোনও ফাংশন কল করার সময় এটির মধ্যে নিজেকে প্রবেশ করতে চায় এমন একটি বিশেষ দৃশ্যপট দৃশ্য।

উদাহরণ:

void onChange()
{
    screen.draw(this);
}

7

আমি এটিকে সর্বত্র পাশাপাশি ব্যবহার করার প্রবণতা রাখি, এটি নিশ্চিত করার জন্য যে এটি স্পষ্ট হয় যে এটি উদাহরণস্বরূপ সদস্য যেগুলি আমরা কাজ করছি।


5

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


5

এই কীওয়ার্ডটির জন্য আর কিছুটা বিরল ব্যবহার হ'ল যখন আপনাকে বাস্তবায়নকারী শ্রেণীর মধ্যে থেকে একটি স্পষ্ট ইন্টারফেস বাস্তবায়ন শুরু করতে হয়। এখানে একটি স্বীকৃত উদাহরণ:

class Example : ICloneable
{
    private void CallClone()
    {
        object clone = ((ICloneable)this).Clone();
    }

    object ICloneable.Clone()
    {
        throw new NotImplementedException();
    }
}

4

আমি এটি ব্যবহার করার সময় এখানে:

  • শ্রেণীর মধ্যে থেকে ব্যক্তিগত পদ্ধতি অ্যাক্সেস করা (পার্থক্য করতে)
  • বর্তমান অবজেক্টটিকে অন্য পদ্ধতিতে পাস করা (বা কোনও ইভেন্টের ক্ষেত্রে প্রেরক হিসাবে)
  • এক্সটেনশন পদ্ধতি তৈরি করার সময়: ডি

আমি এটি ব্যক্তিগত ক্ষেত্রগুলির জন্য ব্যবহার করি না কারণ আমি আন্ডারস্কোর (_) দিয়ে ব্যক্তিগত ক্ষেত্রের পরিবর্তনশীল নামগুলি উপসর্গ করি।


4

[সি ++]

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

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

  • একটি ফাংশনে "নিজেকে" পাস করা।
  • একটি পয়েন্টার বা "এরকম কিছু" "নিজেকে" অর্পণ করা।
  • কাস্টিং, যেমন উপরে / ডাউন ingালাই (নিরাপদ বা অন্যথায়), কাস্টিং দূর্বলতা ইত্যাদি
  • সংকলক প্রয়োগযোগ্য ছিন্নমূলকরণ।

3

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


3

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

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

class AABB
{
  // ... members
  bool intersects( AABB other )
  {
    return other.left() < this->right() &&
           this->left() < other.right() &&

           // +y increases going down
           other.top() < this->bottom() &&
           this->top() < other.bottom() ;
  }
} ;

(বনাম)

class AABB
{
  bool intersects( AABB other )
  {
    return other.left() < right() &&
           left() < other.right() &&

           // +y increases going down
           other.top() < bottom() &&
           top() < other.bottom() ;
  }
} ;

এক নজরে কোন এএবিবি right()উল্লেখ করে? thisএকটি clarifier একটি বিট যোগ করা হয়েছে।


3

জাকুব Šতুকের উত্তরটিতে ঠিকাদারের মধ্যে ডেটা পাস করার বিষয়ে তার # 5 সম্ভবত কিছুটা ব্যাখ্যা ব্যবহার করতে পারে। এটি ওভারলোডিং কনস্ট্রাক্টরের ক্ষেত্রে এবং এটি এমন এক ক্ষেত্রে যেখানে ব্যবহার thisবাধ্যতামূলক। নিম্নলিখিত উদাহরণে আমরা প্যারামিটারলেস কনস্ট্রাক্টরকে ডিফল্ট প্যারামিটার দিয়ে প্যারামিটারযুক্ত কনস্ট্রাক্টরকে কল করতে পারি।

class MyClass {
    private int _x
    public MyClass() : this(5) {}
    public MyClass(int v) { _x = v;}
}

আমি উপলক্ষে এটি একটি বিশেষ বৈশিষ্ট্যযুক্ত বলে মনে করেছি।


2

আমি ভিজ্যুয়াল সি ++ এ এটি উদারভাবে ব্যবহার করার অভ্যাস পেয়েছি যেহেতু এটি করার ফলে আমি '>' কী চাপলে ইন্টেলিজেন্সগুলি ট্রিগার হয়ে যাবে এবং আমি অলস। (এবং টাইপস প্রবণ)

তবে আমি এটি ব্যবহার অব্যাহত রেখেছি, যেহেতু আমি এটি দেখতে সুবিধাজনক মনে করি যে আমি কোনও বিশ্বব্যাপী ফাংশন না করে সদস্য ফাংশনটি কল করছি।


1

আমি _ এর সাথে ক্ষেত্রগুলিকে আন্ডারস্কোর করি so সুতরাং এটি কখনও ব্যবহার করার দরকার নেই। এছাড়াও আর # যাইহোক সেগুলি দূরে সরিয়ে দেয় ...


1

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


1

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

boolean sameValue (SomeNum other) {
   return this.importantValue == other.importantValue;
} 

1

[সি ++]

এই নিয়োগ অপারেটর ব্যবহার করা হয় যেখানে সময় আপনি চেক করুন এবং মত (অনিচ্ছাকৃত বিপজ্জনক, বা প্রোগ্রামের জন্য সময় শুধু একটি বর্জ্য) অদ্ভুত প্রতিরোধ জিনিষ আছে অধিকাংশ:

A a;
a = a;

আপনার অ্যাসাইনমেন্ট অপারেটর লেখা হবে:

A& A::operator=(const A& a) {
    if (this == &a) return *this;

    // we know both sides of the = operator are different, do something...

    return *this;
}

1

this একটি সি ++ সংকলক

সি ++ সংকলকটি যদি তাৎক্ষণিকভাবে এটির সন্ধান না পায় তবে নিঃশব্দে প্রতীকটির সন্ধান করবে। কিছু সময়, বেশিরভাগ সময়, এটি ভাল থাকে:

  • আপনি যদি শিশু শ্রেণিতে ওভারলোড না করে থাকেন তবে মাদার ক্লাসের পদ্ধতিটি ব্যবহার করুন।
  • কোনও প্রকারের মানকে অন্য প্রকারে প্রচার করে

তবে কখনও কখনও, আপনি কেবল সংকলকটি অনুমান করতে চান না। আপনি সংকলকটি সঠিক প্রতীকটি বেছে নিতে চান অন্যটি নয়।

আমার জন্য , সেই সময়গুলি যখন কোনও পদ্ধতির মধ্যে থাকে তখন আমি কোনও সদস্য পদ্ধতি বা সদস্য ভেরিয়েবল অ্যাক্সেস করতে চাই। আমি চাই না যে আমি কিছু র্যান্ডম প্রতীক বেছে নেব কেবল তার printfবদলে লিখেছিprintthis->printfসংকলন করতে হবে না।

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

এই কারণগুলি আমি ব্যবহার করি this

(§) এটি এখনও আমার কাছে এক ধরণের রহস্য, তবে আমি এখন অবাক হয়েছি যে আপনি যদি আপনার উত্সটিতে <উইন্ডোজ h> শিরোনামটি অন্তর্ভুক্ত করেন তবে এই কারণেই সমস্ত উত্তরাধিকার সি লাইব্রেরি চিহ্নগুলি আপনার বিশ্বব্যাপী নেমস্পেসকে দূষিত করবে will

(§§) বুঝতে পেরেছিলেন যে "আপনাকে একটি শিরোনাম অন্তর্ভুক্ত করতে হবে, তবে এই শিরোনামটি অন্তর্ভুক্ত করে আপনার কোডটি ভেঙে দেবে কারণ এটি একটি সাধারণ নাম সহ কিছু বোবা ম্যাক্রো ব্যবহার করে" একটি কোডারের জীবনের সেই রুশ রুলেট মুহুর্তগুলির মধ্যে একটি is


1

'এই.' প্রচুর সদস্য (সাধারণত গভীর উত্তরাধিকার শৃঙ্খলার কারণে) দিয়ে 'এই' শ্রেণিতে সদস্যদের খুঁজে পেতে সহায়তা করে।

সিটিআরএল + স্পেস হিট করা এটিকে সাহায্য করে না, কারণ এতে প্রকারগুলিও অন্তর্ভুক্ত রয়েছে; যেখানে 'এই।' শুধুমাত্র সদস্যদের অন্তর্ভুক্ত।

আমার পরে যা ছিল তা আমি একবার মুছে ফেলি: তবে এটি কেবল আমার স্টাইলটিই ভেঙে যাচ্ছে।

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


1

আমি যতবার পারি এটি ব্যবহার করি। আমি বিশ্বাস করি এটি কোডটিকে আরও পঠনযোগ্য করে তোলে এবং আরও পঠনযোগ্য কোড কম বাগ এবং আরও রক্ষণাবেক্ষণের সমান।


1

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

আমার কাছে এটি এটি করা ভাল ধারণা দেয়, আপনি শ্রেণি-ভেরিয়েবল এবং পদ্ধতি-ভেরিয়েবলের মধ্যে পার্থক্য করার সময় কোডটি পড়া সহজ হয়।


0

এটি কোডিং স্ট্যান্ডার্ডের উপর নির্ভর করে যা আমি কাজ করছি। যদি আমরা উদাহরণ ব্যবহার করে চলক বোঝাতে _ ব্যবহার করি তবে "এটি" অপ্রয়োজনীয় হয়ে যায়। যদি আমরা _ ব্যবহার না করি তবে আমি উদাহরণ ভেরিয়েবল চিহ্নিত করতে এটি ব্যবহার করার ঝোঁক রাখি।


0

আমি এটা ব্যবহার ডাকা Intellisense ঠিক JohnMcG , কিন্তু আমি ফিরে যান এবং মুছে ফেলুন পাবেন, "this->" যখন আমি কাজ করছি। আমি মাইক্রোসফ্ট কনভেনশনকে "এম_" এর সাথে সদস্য ভেরিয়েবলের উপসর্গটি অনুসরণ করি, সুতরাং এটি ডকুমেন্টেশন হিসাবে রেখে যাওয়া কেবল অপ্রয়োজনীয় হবে।


0

1 - প্রচলিত জাভা সেটার আইডিয়োম:

 public void setFoo(int foo) {
     this.foo = foo;
 }

2 - পরামিতি হিসাবে এই বস্তুর সাথে কোনও ফাংশন কল করার সময়

notifier.addListener(this);

0

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

আপনি thisঅন্যান্য টেমপ্লেটগুলির উত্তরাধিকার সূত্রে টেম্পলেট শ্রেণীর অভ্যন্তরে কোনও অ-নির্ভরশীল নামকে একটি যুক্তি নির্ভর নির্ভর নামতে রূপান্তর করতে ব্যবহার করতে পারেন ।

template <typename T>
struct base {
   void f() {}
};

template <typename T>
struct derived : public base<T>
{
   void test() {
      //f(); // [1] error
      base<T>::f(); // quite verbose if there is more than one argument, but valid
      this->f(); // f is now an argument dependent symbol
   }
}

টেমপ্লেট দুটি পাস ব্যবস্থার সাথে সংকলিত হয়। প্রথম পাসের সময়, কেবলমাত্র অ-তর্ক-নির্ভর নির্ভর নামগুলি সমাধান করে পরীক্ষা করা হয়, তবে নির্ভরশীল নামগুলি কেবলমাত্র সংযুক্তির জন্য পরীক্ষা করা হয়, টেমপ্লেট আর্গুমেন্টগুলি বাস্তবে না রেখে।

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

সমাধানটি অ-নির্ভরশীল নামকে fএকটি নির্ভরশীল নামে পরিণত করছে। এটি বেশ কয়েকটি উপায়ে করা যেতে পারে, যেখানে এটি প্রয়োগ করা হয়েছে তা স্পষ্টভাবে উল্লেখ করে (- base<T>::fসংকেত সংকেতকে base<T>নির্ভর করে তোলে এবং সংকলকটি Tকেবল এটি অনুমান করে যে এটি উপস্থিত থাকবে এবং দ্বিতীয় পাসের জন্য প্রকৃত চেকটি স্থগিত করবে) যুক্তি প্রতিস্থাপন।

দ্বিতীয় উপায়, যদি আপনি একাধিক যুক্তি, বা দীর্ঘ নাম রয়েছে এমন টেম্পলেটগুলি থেকে উত্তরাধিকারী হন this->তবে চিহ্নটির আগে একটি যুক্ত করা হচ্ছে । আপনি যে টেম্পলেট শ্রেণিটি প্রয়োগ করছেন সেটি আর্গুমেন্টের উপর নির্ভর করে (এটি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় base<T>) this->আর্গুমেন্ট নির্ভর এবং আমরা একই ফল পাই: this->fটেম্পলেট প্যারামিটার প্রতিস্থাপনের পরে দ্বিতীয় রাউন্ডে পরীক্ষা করা হয়।


-2

আপনার একেবারে প্রয়োজন না হলে আপনার "এটি" ব্যবহার করা উচিত নয়।

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

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