কোনটি ভাল, ফেরতের মান বা পরামিতিটি ভাল?


147

যদি আমরা কোনও পদ্ধতি থেকে কোনও মান পেতে চাই, তবে আমরা এর মতো হয় ফেরতের মানটি ব্যবহার করতে পারি:

public int GetValue(); 

বা:

public void GetValue(out int x);

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

ধন্যবাদ.


3
উদাহরণস্বরূপ, সি # এর পাইথনের মতো একাধিক রিটার্ন মান রয়েছে।
ট্র্যাপ করুন

12
@ ট্র্যাপ আপনি চাইলে কোনও ফিরিয়ে Tupleদিতে পারেন, তবে সাধারণ sensকমত্য হল যে আপনাকে যদি একের বেশি জিনিস ফেরতের দরকার হয় তবে জিনিসগুলি সাধারণত কোনওভাবে সম্পর্কিত হয় এবং সেই সম্পর্কটি সাধারণত শ্রেণি হিসাবে প্রকাশ করা হয়।
ফারাপ

2
@ ফারাপ এর বর্তমান আকারে সি # তে টিপলসটি কেবল কুরুচিপূর্ণ, তবে এটি আমার মতামত। অন্যদিকে, "সাধারণ sensকমত্য" অর্থ ব্যবহারযোগ্যতা এবং উত্পাদনশীলতার দিক থেকে কিছুই নয়। আপনি একই কারণে কয়েকটি মান ফেরত দেওয়ার জন্য কোনও শ্রেণি তৈরি করবেন না কারণ আপনি রেফ / আউট প্যারামিটার হিসাবে কয়েকটি মান ফেরত দেওয়ার জন্য কোনও শ্রেণি তৈরি করবেন না।
ট্র্যাপ

@ ট্র্যাপ return Tuple.Create(x, y, z);কি কুৎসিত নয়? এ ছাড়া ভাষা স্তরে তাদের পরিচয় করিয়ে দিতে দেরি হয়ে গেছে। রেফ / আউট প্যারামিটার থেকে মানগুলি ফেরত দেওয়ার জন্য আমি কোনও শ্রেণি তৈরি না করার কারণ হ'ল রেফ / আউট প্যারামগুলি কেবলমাত্র বড় মিউটেবল স্ট্রাক্টের (ম্যাট্রিকের মতো) বা alচ্ছিক মানগুলির জন্য সত্যই অর্থবোধ করে এবং পরবর্তীটি বিতর্কযোগ্য।
ফারাপ

@ ফারাপ সি # টিম সক্রিয়ভাবে ভাষা স্তরে টিপলস প্রবর্তন করতে চাইছে। যদিও এটি .NET এখন অপ্রচলিত বিকল্পগুলির পুরো আধিক্যটিকে স্বাগত জানায় - বেনামে টাইপ Tuple<>,। নেট এবং সি # টিপলস !. আমি কেবল সি-কে সংকলক autoইনফেরিং টাইপের (পদ্ধতিতে যেমন ) থেকে বেনামে প্রকারের ফিরে আসার অনুমতি দিয়েছি।
নওফাল

উত্তর:


153

পদ্ধতিতে ফিরে আসার মতো আর কিছু না থাকায় রিটার্ন মানগুলি প্রায় সর্বদা সঠিক পছন্দ হয়। (আসলে, আমি কোনো ক্ষেত্রে যেখানে আমি চাই মনে করতে পারেন না কি একটি সঙ্গে একটি অকার্যকর পদ্ধতি চান outপরামিতি, আমি যদি পছন্দ ছিল। সি # 7 এর Deconstructভাষা সমর্থিত বিনির্মাণ জন্য পদ্ধতি এই নিয়মের একটি খুব, খুব বিরল ব্যতিক্রম হিসাবে কাজ করে ।)

অন্য যে কোনও কিছু বাদে, কলারটি পৃথকভাবে ভেরিয়েবলটি ঘোষণা করতে থামায়:

int foo;
GetValue(out foo);

বনাম

int foo = GetValue();

আউটপুট মানগুলিও এইভাবে পদ্ধতিতে শৃঙ্খলা রোধ করে:

Console.WriteLine(GetValue().ToString("g"));

(প্রকৃতপক্ষে, সম্পত্তি সম্পত্তি স্থাপনকারীদের ক্ষেত্রেও এটি অন্যতম সমস্যা এবং সেই কারণেই বিল্ডার প্যাটার্ন এমন পদ্ধতি ব্যবহার করে যা বিল্ডারকে ফেরত দেয়, যেমন myStringBuilder.Append(xxx).Append(yyy)।)

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

প্রত্যাবর্তন মানগুলি FTW।

সম্পাদনা: যা চলছে তার নিরিখে ...

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

using System;

class Test
{
    static int value;

    static void ShowValue(string description)
    {
        Console.WriteLine(description + value);
    }

    static void Main()
    {
        Console.WriteLine("Return value test...");
        value = 5;
        value = ReturnValue();
        ShowValue("Value after ReturnValue(): ");

        value = 5;
        Console.WriteLine("Out parameter test...");
        OutParameter(out value);
        ShowValue("Value after OutParameter(): ");
    }

    static int ReturnValue()
    {
        ShowValue("ReturnValue (pre): ");
        int tmp = 10;
        ShowValue("ReturnValue (post): ");
        return tmp;
    }

    static void OutParameter(out int tmp)
    {
        ShowValue("OutParameter (pre): ");
        tmp = 10;
        ShowValue("OutParameter (post): ");
    }
}

ফলাফল:

Return value test...
ReturnValue (pre): 5
ReturnValue (post): 5
Value after ReturnValue(): 10
Out parameter test...
OutParameter (pre): 5
OutParameter (post): 10
Value after OutParameter(): 10

পার্থক্যটি "পোস্ট" পদক্ষেপে রয়েছে - যেমন স্থানীয় ভেরিয়েবল বা পরামিতি পরিবর্তন করার পরে। রিটার্নভ্যালু পরীক্ষায়, এটি স্ট্যাটিক valueভেরিয়েবলের সাথে কোনও পার্থক্য করে না । আউটপ্যারামিটার পরীক্ষায়, valueভেরিয়েবলটি লাইন দ্বারা পরিবর্তিত হয়tmp = 10;


2
আপনি আমাকে বিশ্বাস করেছেন যে রিটার্নের মানটি আরও ভাল। তবে আমি এখনও অবাক হই যে "গভীরতায়" কী হয়। মানে, রিটার্ন মান এবং আউট প্যারামিটার, তারা কীভাবে তৈরি, নির্ধারিত এবং ফিরে আসার পদ্ধতিতে আলাদা?
কোয়ান মাই

1
ট্রাইপার্স হ'ল আউট প্যারাম ব্যবহার করা উপযুক্ত এবং পরিষ্কারের সর্বোত্তম উদাহরণ। যদিও আমি এটি বিশেষ ক্ষেত্রে যেমন ব্যবহার করেছি (ওয়ার্কসুক্সিডেড (আউট লিস্ট <স্ট্রিং> ত্রুটি)) যা মূলত ট্রাইপার্সের মতো একই প্যাটার্ন
চাদ গ্রান্ট

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

2
@ অ্যারনসনসওয়েল: কোন সঠিক মন্তব্য? মনে রাখবেন যে উদাহরণ Dictionary.TryGetValueহল না প্রযোজ্য এখানে, যে একটি অকার্যকর পদ্ধতি নয় হিসাবে। আপনি কি ব্যাখ্যা করতে পারেন যে আপনি কেন কোনও ফেরতের মানের পরিবর্তেout প্যারামিটার চান ? (এমনকি , আমি ব্যক্তিগতভাবে সমস্ত আউটপুট তথ্য ধারণ করে এমন কোনও রিটার্ন মান পছন্দ করি prefer আমি কীভাবে এটির নকশা তৈরি করেছি তার উদাহরণের জন্য নোডাটাইমস দেখুন ))TryGetValueParseResult<T>
জন স্কিটি

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

26

কি ভাল, আপনার নির্দিষ্ট পরিস্থিতির উপর নির্ভর করে। এক কারণে outবিদ্যমান এক পদ্ধতি কল থেকে একাধিক মান ফিরে সহজতর হল:

public int ReturnMultiple(int input, out int output1, out int output2)
{
    output1 = input + 1;
    output2 = input + 2;

    return input;
}

সুতরাং একটি সংজ্ঞা দ্বারা অন্য তুলনায় ভাল হয় না। উদাহরণস্বরূপ আপনার উপরের পরিস্থিতিটি না থাকলে তবে আপনি সাধারণত একটি সহজ রিটার্ন ব্যবহার করতে চান।

সম্পাদনা: মূলশব্দটি বিদ্যমান থাকার কারণগুলির মধ্যে এটির একটি কারণ এটি প্রদর্শন করে একটি নমুনা। উপরেরটি কোনওভাবেই সেরা অনুশীলন হিসাবে বিবেচনা করা যায় না।


2
আমি এর সাথে একমত নই, কেন আপনি 4 টি ইনট দিয়ে কোনও ডেটা স্ট্রাকচার ফিরিয়ে দেবেন না? এটি সত্যিই বিভ্রান্তিকর।
চাদ গ্রান্ট

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

2
আমি ক্লাউডের সাথে একমত এটি সর্বোত্তম উপায় নয় বলেই এটির অস্তিত্ব থাকা উচিত নয়।
সেরিব্রাস

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

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

23

আপনার সাধারণত আউট প্যারামের চেয়ে ফেরতের মান পছন্দ করা উচিত। যদি আপনি নিজেকে 2 টি জিনিস করার দরকার হয় এমন কোড লেখার সন্ধান করেন তবে আউট প্যারামগুলি একটি প্রয়োজনীয় মন্দ are এর একটি ভাল উদাহরণ হ'ল চেষ্টা প্যাটার্ন (যেমন Int32.TryParse)।

আসুন বিবেচনা করা যাক আপনার দুটি পদ্ধতির কলকারীকে কি করতে হবে। প্রথম উদাহরণের জন্য আমি এটি লিখতে পারি ...

int foo = GetValue();

লক্ষ্য করুন যে আমি একটি পরিবর্তনশীল ঘোষণা করতে পারি এবং এটি আপনার পদ্ধতির মাধ্যমে এক লাইনে নির্ধারণ করতে পারি। দ্বিতীয় উদাহরণটি দেখতে এটির মতো দেখাচ্ছে ...

int foo;
GetValue(out foo);

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

হালনাগাদ

এই জাতীয় প্রশ্ন জিজ্ঞাসা করার সময় দেখার জন্য একটি ভাল জায়গা হ'ল নেট ফ্রেমওয়ার্ক ডিজাইনের গাইডলাইন। আপনার যদি বইটির সংস্করণ থাকে তবে আপনি অ্যান্ডারস হেজলসবার্গ এবং অন্যদের এই টীকা (পৃষ্ঠা 184-185) দেখতে পাবেন তবে অনলাইন সংস্করণটি এখানে ...

http://msdn.microsoft.com/en-us/library/ms182131(VS.80).aspx

যদি আপনি নিজেকে একটি এপিআই থেকে দুটি জিনিস ফেরত দেওয়ার প্রয়োজন মনে করেন তবে সেগুলি স্ট্রাক্ট / শ্রেণিতে গুটিয়ে রাখা আউট প্যারামের চেয়ে ভাল।


দুর্দান্ত উত্তর, বিশেষত ট্রাই পার্সির রেফারেন্স, একটি (সাধারণ) ফাংশন যা বিকাশকারীদের (অস্বাভাবিক) আউট ভেরিয়েবলগুলি ব্যবহার করতে বাধ্য করে।
সেরিবাস

12

outপ্যারাম ব্যবহারের একটি কারণ রয়েছে যা ইতিমধ্যে উল্লেখ করা হয়নি: কলিং পদ্ধতিটি এটি গ্রহণ করতে বাধ্য। যদি আপনার পদ্ধতিটি এমন কোনও মান উত্পন্ন করে যা কলারকে বাতিল করা উচিত নয়, outএটি কলকারীকে এটি বিশেষভাবে গ্রহণ করতে বাধ্য করে:

 Method1();  // Return values can be discard quite easily, even accidentally

 int  resultCode;
 Method2(out resultCode);  // Out params are a little harder to ignore

অবশ্যই কলার এখনও একটি প্যারামের মানটিকে অগ্রাহ্য করতে পারেout তবে আপনি তাদের মনোযোগ এটিকে বলেছিলেন।

এটি একটি বিরল প্রয়োজন; প্রায়শই, আপনার একটি আসল সমস্যার জন্য একটি ব্যতিক্রম ব্যবহার করা উচিত বা "FYI" এর জন্য রাজ্য সম্পর্কিত তথ্য সহ কোনও জিনিস ফেরত দেওয়া উচিত তবে এমন পরিস্থিতিতেও থাকতে পারে যেখানে এটি গুরুত্বপূর্ণ।


8

এটি প্রধানত পছন্দ

আমি রিটার্ন পছন্দ করি এবং যদি আপনার একাধিক রিটার্ন থাকে তবে আপনি এগুলিকে একটি ফলাফল ডিটিওতে গুটিয়ে রাখতে পারেন

public class Result{
  public Person Person {get;set;}
  public int Sum {get;set;}
}

5

আপনার কেবলমাত্র একটি রিটার্ন মান থাকতে পারে যেখানে আপনার একাধিক আউট প্যারামিটার থাকতে পারে।

এই ক্ষেত্রে আপনাকে কেবল পরামিতিগুলি বিবেচনা করতে হবে।

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


5

আপনার প্রায়শই একটি রিটার্ন মান ব্যবহার করা উচিত। ' out' প্যারামিটারগুলি অনেকগুলি এপিআই, কম্পোজিশন, ইত্যাদিতে কিছুটা ঘর্ষণ তৈরি করে

সর্বাধিক উল্লেখযোগ্য ব্যতিক্রম মনে পড়বে যখন আপনি একাধিক মান ফিরিয়ে দিতে চান (। নেট ফ্রেমওয়ার্কে 4.0 পর্যন্ত টুপল থাকে না) যেমন TryParseপ্যাটার্ন সহ।


এটি একটি ভাল অনুশীলন কিনা তা নিশ্চিত নয় তবে অ্যারেলিস্ট একাধিক মান ফেরত দিতেও ব্যবহার করা যেতে পারে।
বিএ

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

2

আমি এই সাধারণ উদাহরণে যেকোনটির পরিবর্তে নিম্নলিখিতটি পছন্দ করব।

public int Value
{
    get;
    private set;
}

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


2

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


2

অতিরিক্তভাবে, রিটার্ন মানগুলি অ্যাসিনক্রোনাস ডিজাইনের দৃষ্টান্তগুলির সাথে সামঞ্জস্যপূর্ণ।

আপনি কোনও ফাংশন "async" নির্ধারণ করতে পারবেন না যদি এটি রেফ বা আউট প্যারামিটার ব্যবহার করে।

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


"Async" উপাধি উপর দুর্দান্ত পয়েন্ট। ভেবেছিলেন অন্য কেউ তা উল্লেখ করেছেন। শৃঙ্খলাবদ্ধ - পাশাপাশি এক্সপ্রেশন হিসাবে রিটার্ন মান (প্রকৃতপক্ষে ফাংশনটি নিজেই) ব্যবহার করা অন্য কী bene প্রক্রিয়া থেকে কীভাবে জিনিস ফিরে পাওয়া যায় ("বালতি" - টিপল / শ্রেণি / কাঠামো আলোচনা) এবং প্রক্রিয়াটি নিজেই একটি অভিব্যক্তির মতো চিকিত্সা করা যা একক মানের পরিবর্তে প্রতিস্থাপিত হতে পারে (তার কার্যকারিতা নিজেই ফাংশন করুন, কারণ এটি কেবল 1 মান দেয়)।
ব্যবহারকারী 1172173

1

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

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


পদ্ধতিগুলি স্ট্যাক? আমি কোনও সি # বিশেষজ্ঞ নই, তবে x86 কেবল প্রতিটি থ্রেডকে সমর্থন করে supports পদ্ধতির "ফ্রেম" রিটার্নের সময় ডিলেলকেট করা হয়, এবং যদি কোনও প্রসঙ্গে স্যুইচ হ্যান্ডেন্ড হয় তবে ডিলেলকেটেড স্ট্যাকটি ওভাররাইট করা যেতে পারে। সি সমস্ত রিটার্ন মান রেজিস্ট্রি ইক্সে যায়। আপনি যদি বস্তু / স্ট্রাক্টগুলি ফিরিয়ে দিতে চান তবে সেগুলি গাদাতে বরাদ্দ করা দরকার এবং পয়েন্টারটি এ্যাক্সে রাখা হবে।
স্টিফান লুন্ডস্ট্রমে

1

যেমনটি অন্যরা বলেছেন: ফেরতের মান, পরম নয়।

আমি কি আপনাকে "ফ্রেমওয়ার্ক ডিজাইন গাইডলাইনস" (২ য় সংস্করণ) বইটি সুপারিশ করতে পারি? পৃষ্ঠা 184-185 প্যারামগুলি এড়িয়ে যাওয়ার কারণগুলি কভার করে। পুরো বইটি আপনাকে সমস্ত ধরণের। নেট কোডিংয়ের ইস্যুগুলিতে সঠিক দিকে চালিত করবে।

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


1

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

var result = DoThing();
if (result.Success)
{
    result = DoOtherThing()
    if (result.Success)
    {
        result = DoFinalThing()
        if (result.Success)
        {
            success = true;
        }
    }
}

বনাম:

var result;
if (DoThing(out result))
{
    if (DoOtherThing(out result))
    {
        if (DoFinalThing(out result))
        {
            success = true;
        }
    }
}

1

কোন বাস্তব পার্থক্য আছে। আউট প্যারামিটারগুলি সি # তে থাকে যাতে পদ্ধতিতে আরও একটি মান ফেরত দেওয়া যায়, এটাই সব।

তবে কিছুটা সামান্য পার্থক্য রয়েছে, তবে সেগুলির মধ্যে একটিও গুরুত্বপূর্ণ নয়:

প্যারামিটার ব্যবহার করা আপনাকে দুটি লাইনের মতো ব্যবহার করতে বাধ্য করবে:

int n;
GetValue(n);

রিটার্ন মান ব্যবহার করার সময় এটি আপনাকে এক লাইনে করতে দেয়:

int n = GetValue();

আরেকটি পার্থক্য (কেবলমাত্র মান ধরণের জন্য সঠিক এবং শুধুমাত্র সি # যদি ফাংশনটিকে ইনলাইন না করে তবে) হ'ল ফাংশন ফিরে আসার সময় রিটার্ন মান ব্যবহার করে অগত্যা মানটির একটি অনুলিপি তৈরি করা হয়, যখন আউট প্যারামিটার ব্যবহার করার পরে অগত্যা তা করা হয় না।


0

আপনি যখন পদ্ধতিতে ঘোষিত কোনও বস্তু ফেরত দেওয়ার চেষ্টা করছেন তখন আউটটি আরও কার্যকর।

উদাহরণ

public BookList Find(string key)
{
   BookList book; //BookList is a model class
   _books.TryGetValue(key, out book) //_books is a concurrent dictionary
                                     //TryGetValue gets an item with matching key and returns it into book.
   return book;
}

0

ফেরত মূল্য হ'ল স্বাভাবিক পদ্ধতি যা আপনার পদ্ধতি দ্বারা ফিরে আসে।

আউট প্যারামিটার হিসাবে , ভাল আউট এবং রেফ সি # এর 2 কী শব্দ তারা রেফারেন্স হিসাবে ভেরিয়েবলগুলি পাস করার অনুমতি দেয়

মধ্যে বড় পার্থক্য সুত্র এবং আউট হল, সুত্র আগে ইনিশিয়ালাইজ করা উচিত এবং আউট না


-2

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

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

'ভিআরপি' হ'ল একটি ফাংশনের আধুনিক একাডেমিক নাম যা অভিব্যক্তির অংশ হিসাবে ডাকা হয় এবং এর একটি রিটার্ন মান রয়েছে যা অভিব্যক্তির মূল্যায়নের সময় কলকে পরিবর্তিত করে। যেমন একটি বিবৃতি যেমন x = 1 + f(y)ফাংশনf একটি ভিআরপি হিসাবে পরিবেশন করা হয়।

'নির্ধারক' এর অর্থ হ'ল ফাংশনের ফলাফল কেবল তার পরামিতিগুলির মানগুলির উপর নির্ভর করে। আপনি যদি একই প্যারামিটার মানগুলির সাথে আবার কল করেন তবে আপনি একই ফলাফলটি পেতে নিশ্চিত।

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

সুতরাং, যদি সি # তে, আপনার ফাংশনটি নির্বিচারবাদী এবং খাঁটি না হয়, আমি বলি যে আপনি এটিকে একটি voidফাংশন করতে হবে (অন্য কথায়, ভিআরপি নয়), এবং যে মানটি ফিরে আসতে হবে তা কোনও outবা একটি refপ্যারামিটারে ফিরে আসতে হবে ।

উদাহরণস্বরূপ, যদি আপনার একটি ডাটাবেস টেবিল থেকে কিছু সারি মুছে ফেলার কোনও ফাংশন থাকে এবং আপনি এটি মুছে ফেলা সারিগুলির সংখ্যাটি ফিরিয়ে দিতে চান তবে আপনার এটির মতো কিছু ঘোষণা করা উচিত:

public void DeleteBasketItems(BasketItemCategory category, out int count);

আপনি যদি কখনও কখনও এই ফাংশনটি কল করতে চান তবে এটি পান না count আপনি সর্বদা একটি ওভারলোডিং ঘোষণা করতে পারেন।

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

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

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

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


> আপনি যদি কখনও কখনও এই ফাংশনটিতে কল করতে চান তবে গণনা না পান তবে আপনি সর্বদা একটি ওভারলোডিং ঘোষণা করতে পারেন। সি # সংস্করণ ((আমার মনে হয়) এবং পরবর্তী সময়ে, আপনি _একটি আউট প্যারামিটার উপেক্ষা করতে বাতিল চিহ্ন ব্যবহার করতে পারেন , যেমন: ডিলিটব্যাসকেট আইটেমস (বিভাগ, আউট _);
বিতর্ককারী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.