রিটার্ন মাইভার বনাম রিটার্ন (মাইভার) এর মধ্যে কি পার্থক্য রয়েছে?


87

আমি কয়েকটি উদাহরণ সি # কোডের দিকে চেয়ে ছিলাম এবং লক্ষ্য করেছি যে একটি উদাহরণ () এর মধ্যে রিটার্নটি জড়িয়ে রেখেছে।

আমি সর্বদা সবেমাত্র করেছি:

return myRV;

কি পার্থক্য আছে:

return (myRV);

উত্তর:


229

আপডেট: 12 এপ্রিল 2010 এ এই প্রশ্নটি আমার ব্লগের বিষয় ছিল । মজাদার প্রশ্নের জন্য ধন্যবাদ!

অনুশীলনে, কোনও পার্থক্য নেই।

ইন তত্ত্ব একটি পার্থক্য আছে হতে পারে। সি # স্পেসিফিকেশনে তিনটি আকর্ষণীয় পয়েন্ট রয়েছে যেখানে এটি একটি পার্থক্য উপস্থাপন করতে পারে।

প্রথমে, নাম এবং ধরণের গাছের প্রতিনিধিগুলিতে বেনামে ফাংশন রূপান্তর। নিম্নোক্ত বিবেচনা কর:

Func<int> F1() { return ()=>1; }
Func<int> F2() { return (()=>1); }

F1স্পষ্টত আইনী। হয় F2? প্রযুক্তিগতভাবে, না। অনুমানটি 6.5 বিভাগে বলেছে যে ল্যাম্বডা এক্সপ্রেশন থেকে একটি সামঞ্জস্যপূর্ণ প্রতিনিধি প্রকারে রূপান্তর আছে । এটা কি ল্যাম্বডা এক্সপ্রেশন ? না। এটি একটি প্রথম বন্ধনীযুক্ত প্রকাশ যা একটি ল্যাম্বডা এক্সপ্রেশন ধারণ করে

ভিজ্যুয়াল সি # সংকলকটি এখানে একটি ছোট্ট স্পেস লঙ্ঘন করে এবং আপনার জন্য প্রথম বন্ধনী বাতিল করে।

দ্বিতীয়:

int M() { return 1; }
Func<int> F3() { return M; }
Func<int> F4() { return (M); }

F3আইনী হয় F4? নং বিভাগ .5.৫.৩ বলেছে যে একটি প্রথম বন্ধনীযুক্ত এক্সপ্রেশনটিতে কোনও পদ্ধতি গ্রুপ থাকতে পারে না। আবার আপনার সুবিধার জন্য আমরা স্পেসিফিকেশন লঙ্ঘন করি এবং রূপান্তরকে অনুমতি দেব।

তৃতীয়:

enum E { None }
E F5() { return 0; }
E F6() { return (0); }

F5আইনী হয় F6? নং অনুচ্ছেদে বলা হয়েছে যে আক্ষরিক শূন্য থেকে কোনও গণিতের ধরণের রূপান্তর আছে। " (0)" আক্ষরিক শূন্য নয়, এটি একটি বন্ধনী যা পরে আক্ষরিক শূন্য এবং তার পরে একটি প্রথম বন্ধনী হয়। আমরা এখানে স্পেসিফিকেশন লঙ্ঘন করেছি এবং বাস্তবে যে কোনও সংকলন সময় ধ্রুবক অভিব্যক্তি শূন্যের সমান , এবং কেবল আক্ষরিক শূন্য নয় allow

সুতরাং প্রতিটি ক্ষেত্রেই, আমরা আপনাকে এটি থেকে দূরে সরে যেতে অনুমতি দিই, যদিও প্রযুক্তিগতভাবে এটি করা অবৈধ।


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

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

18
@ ব্রুনো: প্রদত্ত বিষয়ের অধ্যয়ন প্রায় আট বা দশ হাজার ঘন্টা লাগে এবং আপনিও এতে বিশেষজ্ঞ হতে পারেন। চার বছরের পূর্ণ-সময়ের কাজের ক্ষেত্রে এটি সহজেইযোগ্য।
এরিক লিপার্ট

32
@ অ্যান্টনি: আমি যখন এটি করি তখন আমি কেবল লোকজনকে বলি যে আমার ডিগ্রি গণিতে নেই , গাণিতিক নয় ।
এরিক লিপার্ট

7
তত্ত্ব অনুসারে, অনুশীলন এবং তত্ত্ব একই তবে প্র্যাকটিসে তারা কখনও হয় না।
দ ইব্রাহিম হাশমি

40

কোণার কেসগুলি রয়েছে যখন বন্ধনীর উপস্থিতি প্রোগ্রামের আচরণে প্রভাব ফেলতে পারে:

ঘ।

using System;

class A
{
    static void Foo(string x, Action<Action> y) { Console.WriteLine(1); }
    static void Foo(object x, Func<Func<int>, int> y) { Console.WriteLine(2); }

    static void Main()
    {
        Foo(null, x => x()); // Prints 1
        Foo(null, x => (x())); // Prints 2
    }
}

ঘ।

using System;

class A
{
    public A Select(Func<A, A> f)
    {
        Console.WriteLine(1);
        return new A();
    }

    public A Where(Func<A, bool> f)
    {
        return new A();
    }

    static void Main()
    {
        object x;
        x = from y in new A() where true select (y); // Prints 1
        x = from y in new A() where true select y; // Prints nothing
    }
}

ঘ।

using System;

class Program
{
    static void Main()
    {
        Bar(x => (x).Foo(), ""); // Prints 1
        Bar(x => ((x).Foo)(), ""); // Prints 2
    }

    static void Bar(Action<C<int>> x, string y) { Console.WriteLine(1); }
    static void Bar(Action<C<Action>> x, object y) { Console.WriteLine(2); }
}

static class B
{
    public static void Foo(this object x) { }
}

class C<T>
{
    public T Foo;
}

আশা করি আপনি বাস্তবে এটি কখনই দেখতে পাবেন না।


আমার প্রশ্নের ঠিক উত্তর নয়, তবে এখনও আকর্ষণীয় - ধন্যবাদ।
খ্রিস্ট

4
আপনি এখানে 2-তে কী চলছে তা ব্যাখ্যা করতে পারেন?
এরিক

4
এই আচরণটি কেন ঘটে তা আপনার বিশদভাবে জানা উচিত।
আর্টুরো টরেস সানচেজ


3

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


6
এটি অবশ্যই একটি নির্দিষ্ট মামলার জন্য প্রশ্নের উত্তর দেবে, তবে এটি অবশ্যই পরিস্থিতির সম্পূর্ণতার প্রতিনিধি হতে পারে না।
বেসকা

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