আপনি C # বা .NET এ দেখেছেন আজবতম কোনটি কী? [বন্ধ]


322

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

string x = new string(new char[0]);
string y = new string(new char[0]);
Console.WriteLine(object.ReferenceEquals(x, y));

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

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

অন্য কোন রত্ন সেখানে লুকিয়ে আছে?


64
মনো 2.0 2.0 আরসি পরীক্ষিত; সত্য
ফেরায়

10
উভয় স্ট্রিংয়ের স্ট্রিং শেষ হয়ে যায় mpএফটি এবং এটি প্রদর্শিত হয় যে ফ্রেমওয়ার্কটি কেবল তার একটি রেফারেন্স রাখে
অ্যাড্রিয়ান জ্যানেস্কু

34
এটি একটি স্মৃতি সংরক্ষণের জিনিস। স্ট্যাটিক মেথড স্ট্রিংয়ের জন্য এমএসডিএন ডকুমেন্টেশন সন্ধান করুন n ইন্টার্ন। সিএলআর স্ট্রিং পুল বজায় রাখে। এই কারণেই অভিন্ন বিষয়বস্তুযুক্ত স্ট্রিংগুলি একই মেমোরিটির অর্থ হিসাবে প্রদর্শিত হয় to
জন লেইডগ্রেন

12
@John: স্ট্রিং interning শুধুমাত্র জন্য স্বয়ংক্রিয়ভাবে ঘটে লিটারেল । এখানে বিষয়টি তেমন নয়। @ ড্যানিয়েলসওয়ে: স্ট্রিংগুলিকে অপরিবর্তনীয় করে তোলার জন্য ইন্টার্নিংয়ের প্রয়োজন হয় না । এটি সম্ভব যে সত্যটি হ'ল অপরিবর্তনীয়তার একটি দুর্দান্ত তাত্পর্য, তবে এখানে কোনওভাবেই সাধারণ ইন্টার্নিং ঘটছে না।
জন স্কিটি

3
: বাস্তবায়ন বিস্তারিত যে এই আচরণ কারণ এখানে ব্যাখ্যা করা হয় blog.liranchen.com/2010/08/brain-teasing-with-strings.html
Liran

উত্তর:


394

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

    static void Foo<T>() where T : new()
    {
        T t = new T();
        Console.WriteLine(t.ToString()); // works fine
        Console.WriteLine(t.GetHashCode()); // works fine
        Console.WriteLine(t.Equals(t)); // works fine

        // so it looks like an object and smells like an object...

        // but this throws a NullReferenceException...
        Console.WriteLine(t.GetType());
    }

তাহলে টি কি ছিল ...

উত্তর: যে কোনও Nullable<T>- যেমন int?। গেটটাইপ () যা হতে পারে না তা বাদে সমস্ত পদ্ধতি ওভাররাইড করা হয়; সুতরাং এটি বস্তুকে কল করতে (বাক্সযুক্ত) নিক্ষেপ করা হয়েছে (এবং তাই নালায়) অবজেক্টকে কল করতে .GetType () ... যা নাল ;-p


আপডেট: প্লটটি আরও ঘন হয় ... আয়েন্দে রাহিয়েন তার ব্লগে একই ধরণের চ্যালেঞ্জ ছুঁড়েছিলেন তবে একটি সহ where T : class, new():

private static void Main() {
    CanThisHappen<MyFunnyType>();
}

public static void CanThisHappen<T>() where T : class, new() {
    var instance = new T(); // new() on a ref-type; should be non-null, then
    Debug.Assert(instance != null, "How did we break the CLR?");
}

তবে তা পরাস্ত হতে পারে! রিমোট করার মতো জিনিসগুলি ব্যবহার করে একই নির্দেশনা ব্যবহার করে; সতর্কতা - নিম্নলিখিতটি খাঁটি মন্দ :

class MyFunnyProxyAttribute : ProxyAttribute {
    public override MarshalByRefObject CreateInstance(Type serverType) {
        return null;
    }
}
[MyFunnyProxy]
class MyFunnyType : ContextBoundObject { }

এটি স্থানে রেখে, new()কলটি প্রক্সিটিতে পুনঃনির্দেশ করা হয়েছে ( MyFunnyProxyAttribute), যা ফিরে আসে null। এবার গিয়ে চোখ ধুয়ে ফেলো!


9
কেন নুলযোগ্য <T> .গেটটাইপ () সংজ্ঞায়িত করা যায় না? ফলাফলটি টাইপফুল হওয়া উচিত নয় (নালাম <টি>)?
ড্রয় নোকস

69
আঁকুন: সমস্যাটি হ'ল গেটটাইপ () ভার্চুয়াল নয়, সুতরাং এটি ওভাররাইড করা হয়নি - যার অর্থ হল পদ্ধতি কলের জন্য মানটি বাক্সড। বাক্সটি নাল রেফারেন্সে পরিণত হয়, সুতরাং এনআরই।
জন স্কিটি

10
@Drew; তদতিরিক্ত, নুলাবল <T> এর জন্য বক্সিং সম্পর্কিত বিশেষ বিধি রয়েছে যার অর্থ একটি খালি নুলাবল <টি> বাক্স বাতিল করতে হবে, এমন একটি বাক্স নয় যা খালি নুলাবল <T> (এবং একটি শূন্য আন-বাক্সে একটি শূন্য নলযোগ্য <টি> >)
মার্ক গ্র্যাভেল

29
খুব, খুব দুর্দান্ত। একটি দুর্দান্ত উপায়ে। ;-)
কনরাড রুডল্ফ

6
কনস্ট্রাক্টর-সীমাবদ্ধতা, সি # ৩.০ ল্যাংজ স্পপে 10.1.5
মার্ক গ্র্যাভেল

216

ব্যাংকারদের রাউন্ডিং।

এটি একটি খুব বেশি সংকলক বাগ বা ত্রুটি নয়, অবশ্যই একটি অদ্ভুত কোণার কেস ...

। নেট ফ্রেমওয়ার্কটি একটি স্কিম বা গোল করে যা ব্যাঙ্কারের রাউন্ডিং হিসাবে পরিচিত।

ব্যাংকারদের রাউন্ডিংয়ে ০.০ নম্বরগুলি নিকটতম সমান সংখ্যায় গোল হয়, তাই

Math.Round(-0.5) == 0
Math.Round(0.5) == 0
Math.Round(1.5) == 2
Math.Round(2.5) == 2
etc...

এটি আরও সুপরিচিত রাউন্ড-হাফ-আপ রাউন্ডিংয়ের উপর ভিত্তি করে আর্থিক গণনায় কিছু অপ্রত্যাশিত বাগের দিকে নিয়ে যায়।

এটি ভিজ্যুয়াল বেসিকের ক্ষেত্রেও সত্য।


22
এটা আমার কাছেও অদ্ভুত লাগছিল। এটি হ'ল অন্ততপক্ষে, যতক্ষণ না আমি সংখ্যার বড় তালিকা তৈরি করেছিলাম এবং তাদের যোগফল গণনা করি। তারপরে আপনি বুঝতে পারবেন যে আপনি যদি কেবল গোল হয়ে যান তবে অ-বৃত্তাকার সংখ্যার যোগফল থেকে আপনি সম্ভাব্য বিশাল পার্থক্যটি শেষ করবেন। খুব খারাপ যদি আপনি আর্থিক গণনা করছেন!
সোভেটোমির সোনভেভ

255
লোকেরা যদি না জানত তবে আপনি এটি করতে পারেন: ম্যাথ.আরউন্ড (এক্স, মিডপয়েন্টরাউন্ডিং Aআওফ্রোমজিরো); রাউন্ডিং স্কিম পরিবর্তন করতে।
আইসিআর

26
দস্তাবেজগুলি থেকে: এই পদ্ধতির আচরণটি আইইইই স্ট্যান্ডার্ড 754, বিভাগ 4 অনুসরণ করে This এই ধরণের রাউন্ডিংটিকে কখনও কখনও নিকটতম, বা ব্যাঙ্কারের গোলাকার বলে। এটি বৃত্তাকার ত্রুটিগুলি হ্রাস করে যা ধারাবাহিকভাবে একটি একক দিকের মিডপয়েন্ট মানটি গোল করে।
আইসিআর

8
আমি অবাক হয়েছি যে এ কারণেই আমি int(fVal + 0.5)প্রায়শই এমন ভাষাগুলিতেও দেখি যাগুলি অন্তর্নির্মিত রাউন্ডিংয়ের কাজ করে।
বেন ফাঁকা

32
হাস্যকর ভাবে, আমি একটি এ কাজ ব্যাঙ্ক একবার এবং অন্যান্য প্রোগ্রামারদের এই সম্পর্কে জানতে আলোকসম্পাতের শুরু চিন্তা যে রাউন্ডইং কাঠামোর মধ্যে ভেঙ্গে গেল
Dan

176

Rec(0)(ডিবাগারের নিচে নয়) হিসাবে ডাকা হলে এই ফাংশনটি কী করবে ?

static void Rec(int i)
{
    Console.WriteLine(i);
    if (i < int.MaxValue)
    {
        Rec(i + 1);
    }
}

উত্তর:

  • 32-বিট জেআইটি-তে এটি স্ট্যাকওভারফ্লোএক্সেপশনের ফলাফল হওয়া উচিত
  • -৪-বিট জেআইটি-তে এটি সমস্ত নম্বর ইন্ট.ম্যাক্সভ্যালুতে মুদ্রণ করা উচিত

এটি কারণ 64৪-বিট জেআইটি সংকলক টেইল কল অপ্টিমাইজেশন প্রয়োগ করে , যেখানে ৩২-বিট জেআইটি তা দেয় না।

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


10
রিলিজ মোডে সংকলন করতে হবে তবে x64 =) এ অবশ্যই কাজ করবে
নিল উইলিয়ামস

3
ভিএস ২০১০ বেরিয়ে আসার পরে আপনার উত্তর আপডেট করার উপযুক্ত হতে পারে যেহেতু সমস্ত বর্তমান
জেআইটিগুলি

3
সবেমাত্র 32-বিট উইনএক্সপি-তে VS2010 বিটা 1 এ চেষ্টা করেছেন। তবুও একটি স্ট্যাকওভারফ্লো এক্সেপশন পান।
স্কুইলম্যান


7
যে ++আমাকে পুরোপুরি ছুড়ে ফেলেছে। আপনি কি Rec(i + 1)সাধারণ মানুষের মতো ফোন করতে পারবেন না ?
কনফিগারকারী

111

এটি বরাদ্দ করুন!


এটি আমি পার্টিতে জিজ্ঞাসা করতে চাই (যার কারণেই সম্ভবত আমাকে আর আমন্ত্রণ করা হয় না):

আপনি কি নিম্নলিখিত কোডটি সংকলন করতে পারবেন?

    public void Foo()
    {
        this = new Teaser();
    }

একটি সহজ প্রতারণা হতে পারে:

string cheat = @"
    public void Foo()
    {
        this = new Teaser();
    }
";

তবে আসল সমাধানটি হ'ল:

public struct Teaser
{
    public void Foo()
    {
        this = new Teaser();
    }
}

সুতরাং এটি সামান্য জানেন যে মান ধরণের (স্ট্রাক্ট) তাদের thisভেরিয়েবলটিকে পুনরায় নিয়োগ করতে পারে।


3
সি ++ ক্লাসগুলি এটিও করতে পারে ... আমি সম্প্রতি কিছুটা আবিষ্কার করেছিলাম, কেবলমাত্র এটি একটি অপ্টিমাইজেশনের জন্য ব্যবহার করার চেষ্টা করার জন্য চিৎকার করতে হবে: পি
এমপেন

1
আমি বাস্তবে নতুন জায়গায় ব্যবহার করছিলাম। সমস্ত ক্ষেত্র আপডেট করার জন্য কেবল একটি দক্ষ উপায় চেয়েছিলেন :)
এমপেন

70
এটিও প্রতারণা: //this = new Teaser();:-)
অ্যান্ড্রু জ্যাকসনজেডে

17
:-) এই প্রতারণামূলক ঘৃণার চেয়ে আমি আমার প্রোডাকশন কোডে সেই চিটগুলিই পছন্দ করতাম ...
ওমর মোড়

2
সিএলআর থেকে সি # এর মাধ্যমে: তারা এটিকে তৈরি করার কারণ হ'ল আপনি অন্য কোনও কনস্ট্রাক্টরের কোনও কাঠামোর প্যারামিটারলেস কনস্ট্রাক্টরকে কল করতে পারেন। আপনি যদি কেবল কাঠামোর একটি মান শুরু করতে চান এবং অন্যান্য মানগুলি শূন্য / নাল (ডিফল্ট) হতে চান তবে আপনি লিখতে পারেন public Foo(int bar){this = new Foo(); specialVar = bar;}। এটি দক্ষ নয় এবং সত্যই ন্যায়সঙ্গত নয় ( specialVarদু'বার বরাদ্দ করা হয়েছে), তবে কেবল এফওয়াইআই। (বইটিতে এই কারণটি দেওয়া হয়েছে, কেন আমাদের কেবল করা উচিত হবে তা আমি জানি না public Foo(int bar) : this())
kizzx2

100

কয়েক বছর আগে, আনুগত্য প্রোগ্রামে কাজ করার সময়, আমাদের গ্রাহকদের দেওয়া পয়েন্টের পরিমাণ নিয়ে একটি সমস্যা হয়েছিল। সমস্যাটি কাস্টিং / ডাবল ইনটকে রূপান্তর করার সাথে সম্পর্কিত।

নীচে কোডে:

double d = 13.6;

int i1 = Convert.ToInt32(d);
int i2 = (int)d;

i1 == i2 করে ?

দেখা যাচ্ছে যে i1! = I2। কনভার্ট এবং কাস্ট অপারেটরে বিভিন্ন গোলাকার নীতিগুলির কারণে আসল মানগুলি হ'ল:

i1 == 14
i2 == 13

ম্যাথ.সিলিং () বা ম্যাথ.ফ্লুর () (বা ম্যাথ.আর মিডপয়েন্ট রাউন্ডিং যা আমাদের প্রয়োজনীয়তাগুলি পূরণ করে) এর সাথে কল করা সর্বদা ভাল

int i1 = Convert.ToInt32( Math.Ceiling(d) );
int i2 = (int) Math.Ceiling(d);

44
একটি পূর্ণসংখ্যার কাছে কাস্ট করা গোল হয় না, এটি কেবল এটি বন্ধ করে দেয় (কার্যকরভাবে সর্বদা গোল হয়ে যায়)। সুতরাং এটি সম্পূর্ণ জ্ঞান করে।
ম্যাক্স শেমলিং

57
@ ম্যাক্স: হ্যাঁ, তবে কেন রূপান্তর হয়?
স্টিফান স্টেইনগার

18
পছন্দ করেছেন এছাড়াও লক্ষ করুন যে শ্রেণীর নাম কনভার্ট না কাস্ট।
বাগ-এ-লট

3
ভিবিতে: সিআইএনটি () রাউন্ড। () কাটা কাটা। একবার আমাকে পোড়া ( blog.wassupy.com/2006/01/i-can-believe-it-not-truncating.html )
মাইকেল হেরেন

74

এনাম ফাংশন ওভারলোড থাকা সত্ত্বেও তাদের 0 টি পূর্ণসংখ্যা করা উচিত।

আমি এনুমে 0 ম্যাপিংয়ের জন্য সি # কোর দলের যুক্তি জানতাম, তবে এখনও, এটি যতটা অर्थোগোনাল তা হওয়া উচিত নয়। Npgsql থেকে উদাহরণ ।

পরীক্ষার উদাহরণ:

namespace Craft
{
    enum Symbol { Alpha = 1, Beta = 2, Gamma = 3, Delta = 4 };


   class Mate
    {
        static void Main(string[] args)
        {

            JustTest(Symbol.Alpha); // enum
            JustTest(0); // why enum
            JustTest((int)0); // why still enum

            int i = 0;

            JustTest(Convert.ToInt32(0)); // have to use Convert.ToInt32 to convince the compiler to make the call site use the object version

            JustTest(i); // it's ok from down here and below
            JustTest(1);
            JustTest("string");
            JustTest(Guid.NewGuid());
            JustTest(new DataTable());

            Console.ReadLine();
        }

        static void JustTest(Symbol a)
        {
            Console.WriteLine("Enum");
        }

        static void JustTest(object o)
        {
            Console.WriteLine("Object");
        }
    }
}

18
বাহ এটা আমার জন্য নতুন। ConverTo.ToIn32 () কীভাবে কাজ করে কিন্তু কাস্টিং (ইনট) 0 হয় না তাও বিভক্ত করা হয়েছে। এবং অন্য কোনও সংখ্যা> 0 কাজ করে। ("কাজগুলি" বলতে আমি অর্থটিকে বোঝার জন্য বোঝাই))
লুকাস

এই আচরণের চারপাশে ভাল অনুশীলনগুলি প্রয়োগ করার জন্য একটি কোড বিশ্লেষণের নিয়ম রয়েছে : এমএসডিএন.মাইক্রোসফট. /en-us/library/ms182149%28VS.80%29.aspx এই লিঙ্কটিতে 0-ম্যাপিং কীভাবে কাজ করে তার একটি দুর্দান্ত বর্ণনা রয়েছে ।
ক্রিস ক্লার্ক 20

1
@ ক্রিস ক্লার্ক: আমি এনাম প্রতীকটিতে কোনও = 0 রাখার চেষ্টা করেছি। এখনও সংকলক 0 এবং এমনকি (পূর্বাংশ) 0 এর জন্য এনাম চয়ন করে
মাইকেল বুয়েন

2
আইএমও তাদের এমন একটি কীওয়ার্ড চালু করা উচিত noneযা কোনও এনামে রূপান্তরিত হতে পারে এবং 0 টি সর্বদা একটি আন্ত তৈরি করে এবং এমনিতে স্পষ্টভাবে রূপান্তরিত হয় না।
কোডসইনচাওস

5
ConverTo.ToIn32 () কাজ করে কারণ এর ফলাফলটি কোনও সংকলনের ধ্রুবক নয়। এবং শুধুমাত্র সংকলন ধ্রুবক 0 একটি এনামে রূপান্তরযোগ্য। । নেট এর পূর্ববর্তী সংস্করণগুলিতে এমনকি কেবল 0আক্ষরিকেরই রূপান্তরিত হওয়া উচিত ছিল। এরিক লিপার্টের ব্লগটি দেখুন: ব্লগস.এমএসএনএন
বি

67

এটি এখন অবধি দেখা সবচেয়ে অস্বাভাবিকগুলির মধ্যে একটি (অবশ্যই এখানে অবশ্যই বাদ দেওয়া হয়েছে):

public class Turtle<T> where T : Turtle<T>
{
}

এটি আপনাকে এটি ঘোষণা করতে দেয় তবে এর কোন ব্যবহার নেই, যেহেতু এটি আপনাকে কেন্দ্রের যে কোনও শ্রেণীর স্টাফকে অন্য টার্টেলের সাথে আবদ্ধ করতে সর্বদা জিজ্ঞাসা করবে।

[রসিকতা] আমার ধারণা, এটি কচ্ছপগুলি সমস্তভাবেই নামছে ... [/ রসিকতা]


34
আপনি উদাহরণগুলি তৈরি করতে পারেন, যদিও:class RealTurtle : Turtle<RealTurtle> { } RealTurtle t = new RealTurtle();
মার্ক গ্রাভেল

24
প্রকৃতপক্ষে. এটি জাভা এনামগুলি দুর্দান্ত প্রভাবের জন্য ব্যবহার করে। আমি এটি প্রোটোকল বাফারগুলিতেও ব্যবহার করি।
জন স্কিটি

6
আরসিআইএক্স, ওহ হ্যাঁ।
জোশুয়া

8
অভিনব জেনেরিক্সের স্টাফগুলিতে আমি এই প্যাটার্নটি বেশ ব্যবহার করেছি। এটি সঠিকভাবে টাইপযুক্ত ক্লোন বা নিজের উদাহরণ তৈরি করার মতো জিনিসগুলিকে মঞ্জুরি দেয়।
Lucero

20
এই 'অদ্ভুতভাবে টেমপ্লেট প্যাটার্ন আবর্তক' হল en.wikipedia.org/wiki/Curiously_recurring_template_pattern
porges

65

এখানে একটি মাত্র আমি সম্প্রতি জানতে পেরেছি ...

interface IFoo
{
   string Message {get;}
}
...
IFoo obj = new IFoo("abc");
Console.WriteLine(obj.Message);

উপরে এক নজরে পাগল সৌন্দর্য, কিন্তু আইনি আসলে .কোন, সত্যিই যদিও আমি একটি মূল অংশ মিস আউট করেছি (, কিন্তু এটা নয় মত "নামক একটি বর্গ যোগ কিছু হল hacky IFoo" বা "একটি যোগ usingবিন্দু ওরফেIFoo একটি এ বর্গ ")।

আপনি কেন বুঝতে পারেন তা দেখুন, তাহলে: কে বলে আপনি কোনও ইন্টারফেস ইনস্ট্যান্ট করতে পারবেন না?


1
"ওরফে ব্যবহার" জন্য +1 - আমি জানতাম না আপনি কাজ করতে পারে যে !
ডেভিড


তুমি জারজ! আপনি অন্তত "নির্দিষ্ট পরিস্থিতিতে" বলতে পারেন ... আমার সংকলক অস্বীকার করে!
এম এ হানিন

56

বুলিয়ান কখন সত্য বা মিথ্যা হয় না?

বিল আবিষ্কার করেছে যে আপনি একটি বুলিয়ান হ্যাক করতে পারেন যাতে যদি এটি সত্য হয় এবং বি সত্য হয়, (এ এবং বি) মিথ্যা।

হ্যাক বুলিয়ান্স


134
এটি যখন অবশ্যই FILE_NOT_FOUND, অবশ্যই!
গ্রেগ

12
এটি আকর্ষণীয় কারণ এটির অর্থ গাণিতিকভাবে বলা যায় যে সি # তে কোনও বিবৃতি প্রমাণযোগ্য নয়। ওহো।
সাইমন জনসন

20
কোনও দিন আমি এমন একটি প্রোগ্রাম লিখব যা এই আচরণের উপর নির্ভর করে এবং অন্ধকারের নরকরা আমার জন্য একটি স্বাগত প্রস্তুত করবে। Bwahahahahaha!
জেফ্রি এল হুইটলেজ

18
এই উদাহরণটি বিটওয়াস ব্যবহার করে, লজিকাল অপারেটরগুলি নয়। কীভাবে অবাক হয়?
জোশ লি

6
ওয়েল, তিনি স্ট্রাক্টটির লেআউট হ্যাক করেন অবশ্যই আপনি অদ্ভুত ফলাফল পাবেন, এটি তেমন অবাক বা অপ্রত্যাশিত নয়!
অয়ন টোডেরেল

47

আমি পার্টিতে কিছুটা দেরি করে আসছি, তবে আমি তিন চার পাঁচটি পেয়েছি :

  1. যদি আপনি এমন কোনও নিয়ন্ত্রণে ইনভোকেরকোয়ার্ডকে পোল করেন যা লোড / দেখানো হয়নি, এটি মিথ্যা বলবে - এবং যদি আপনি এটি অন্য থ্রেড থেকে পরিবর্তন করার চেষ্টা করেন তবে আপনার মুখটি ফুঁসে উঠবে ( সমাধানটি এটির রেফারেন্স দেবে the নিয়ন্ত্রণ)।

  2. আর একটি যা আমাকে ছড়িয়ে দিয়েছে তা হল এটি দিয়ে একটি সমাবেশ করা হয়েছে:

    enum MyEnum
    {
        Red,
        Blue,
    }

    যদি আপনি অন্য সমাবেশে MyEnum.Red.ToString () গণনা করেন এবং সময়ের মধ্যে কেউ আপনার এনামটি পুনরায় সংকলন করে থাকে:

    enum MyEnum
    {
        Black,
        Red,
        Blue,
    }

    রানটাইম এ, আপনি "কালো" পাবেন।

  3. আমি কিছু সহজ কনস্ট্যান্টের সাথে একটি অংশীদারিত্বের সমাবেশ করেছি My ভিএস যখন তাদের মানগুলিতে সংকলিত হয়েছিল, এবং উল্লেখগুলি নয় তখন আমি কিছুটা অবাক হয়েছিলাম।

  4. আপনি সমাবেশ আরেকটি থেকে একটি ইন্টারফেসের নতুন পদ্ধতি বাস্তবায়ন, কিন্তু আপনি সমাবেশ করে পুরোনো সংস্করণ উল্লেখ পুনর্নির্মাণের, তাহলে আপনি একটি TypeLoadException ( 'NewMethod' কোন বাস্তবায়ন) পেতে, যদিও আপনি আছে বাস্তবায়ন (দেখুন এখানে )।

  5. অভিধান <,>: "আইটেমগুলি যে ক্রমে ফেরত পাঠানো হবে তা নির্ধারিত নয়"। এটি ভয়াবহ , কারণ এটি আপনাকে মাঝে মাঝে দংশন করতে পারে তবে অন্যকে কাজ করতে পারে এবং আপনি যদি অন্ধভাবেই ধরে নিয়েছেন যে অভিধানটি দুর্দান্ত খেলবে ("এটি কেন করা উচিত নয়? আমি ভেবেছিলাম, তালিকাটি করে"), আপনাকে সত্যই করতে হবে অবশেষে আপনার অনুমানকে প্রশ্ন করা শুরু করার আগে এটিতে আপনার নাক থাকুন।


6
# 2 একটি আকর্ষণীয় উদাহরণ। এনামগুলি হল অবিচ্ছেদ্য মানগুলির সংকলক ম্যাপিং। সুতরাং আপনি স্পষ্টভাবে তাদের মানগুলি নির্ধারিত না করলেও, সংকলকটি করেছিল যার ফলস্বরূপ MyEnum.Red = 0 এবং MyEnum.Blue = 1 তৈরি হয়েছিল, যখন আপনি কালো যুক্ত করেছেন, আপনি মান 0 থেকে মানটিকে লাল থেকে নতুন হিসাবে সংজ্ঞায়িত করেছেন। আমার সন্দেহ হয় যে সিরিয়ালাইজেশন এর মতো অন্যান্য ব্যবহারগুলিতেও সমস্যাটি প্রকাশ পেয়েছিল।
এলবুশকিন

3
ডাকা প্রয়োজন জন্য +1। আমাদের 'তে আমরা রেড = 1, নীল = 2 এর মতো এনামগুলিতে স্পষ্টভাবে মানগুলি অর্পণ করতে পছন্দ করি যাতে নতুন এর আগে বা পরে itোকানো যায় এটির ফলে সর্বদা একই মান হবে। এটি বিশেষভাবে প্রয়োজনীয় যদি আপনি ডাটাবেসে মানগুলি সংরক্ষণ করেন।
TheVilageIdiot

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

21
@ ওয়েজ, সোর্টড ডিকোরিয়ানের মতো সম্ভবত?
অ্যালন গুরালেক

4
# 3 ঘটে কারণ ধ্রুবকগুলি যেখানেই ব্যবহার করা হয় না কেন সর্বক্ষেত্র হিসাবে sertedোকানো হয় (সি # তে, অন্তত)। আপনার পূর্বসূরীরা ইতিমধ্যে এটি লক্ষ্য করে থাকতে পারে, এ কারণেই তারা কেবল-প্রাপ্ত সম্পত্তিটি ব্যবহার করে। তবে, একটি পঠনযোগ্য ভেরিয়েবল (কনস্টের বিপরীতে) ঠিক পাশাপাশি কাজ করবে।
রিমুন

33

ভিবি.এন.ই.টি., নেট এবং টেনারি অপারেটর:

Dim i As Integer? = If(True, Nothing, 5)

এটি আমার ডিবাগ করতে কিছুটা সময় নিয়েছিল, যেহেতু আমি iএটি ধারণ করেছিলামNothing

আমি আসলে কি ধারণ করে? 0

এটি আশ্চর্যজনক হলেও বাস্তবে "সঠিক" আচরণ: Nothingভিবি.এনইটি-তে ঠিক nullসিএলআর-র মতো নয়: প্রসঙ্গের উপর নির্ভর করে Nothingকোনও মানে nullবা default(T)মান টাইপ করতে পারে T। উপরের ক্ষেত্রে, সাধারণ ধরণের হিসাবে Ifঅনুমান Integerকরা Nothingএবং 5তাই, এই ক্ষেত্রে, Nothingমানে 0


যথেষ্ট আকর্ষণীয়, আমি এই উত্তরটি খুঁজে পেতে ব্যর্থ হলাম তাই আমাকে একটি প্রশ্ন তৈরি করতে হয়েছিল । আচ্ছা, এই থ্রেডে উত্তরটি কে জানে?
জিসার্গ

28

আমি একটি দ্বিতীয় সত্যিই অদ্ভুত কর্নার কেস পেয়েছি যা আমার প্রথমটিকে দীর্ঘ শট দিয়ে ats

স্ট্রিং.একুয়ালস পদ্ধতি (স্ট্রিং, স্ট্রিং, স্ট্রিংকম্প্রেশন) আসলে পার্শ্ব প্রতিক্রিয়া মুক্ত নয়।

আমি কোডের একটি ব্লকে কাজ করছিলাম যা কিছু ফাংশনের শীর্ষে নিজেই একটি লাইনে ছিল:

stringvariable1.Equals(stringvariable2, StringComparison.InvariantCultureIgnoreCase);

সেই লাইনটি সরিয়ে প্রোগ্রামের অন্য কোথাও স্ট্যাকের ওভারফ্লোতে নিয়ে যায়।

কোডটি পূর্বেঅ্যাস্প্যাকশনলুড ইভেন্টের মূলত যা ছিল তার জন্য একটি হ্যান্ডলার ইনস্টল করা এবং কী করার চেষ্টা করে দেখা গেল

if (assemblyfilename.EndsWith("someparticular.dll", StringComparison.InvariantCultureIgnoreCase))
{
    assemblyfilename = "someparticular_modified.dll";
}

এতক্ষণে আমার আপনাকে বলার দরকার নেই। স্ট্রিং তুলনায় এর আগে কখনও ব্যবহার করা হয়নি এমন সংস্কৃতি ব্যবহার করা অ্যাসেম্বলি লোডের কারণ হয়। ইনভেরিন্টকালচার এটি ব্যতিক্রম নয়।


আমার ধারণা "অ্যাসেম্বলি লোড করা" এর একটি পার্শ্ব প্রতিক্রিয়া, যেহেতু আপনি এটি পূর্বেঅ্যাস্পলক লোড দিয়ে পর্যবেক্ষণ করতে পারেন!
জ্যাকব ক্রোল

2
কি দারুন. এটি রক্ষণাবেক্ষণকারীটির পায়ে নিখুঁত শট। আমি অনুমান করি একটি পূর্বেঅ্যাস্পাবলড হ্যান্ডলারটি লেখার ফলে এই জাতীয় প্রচুর চমক দেখা যায়।
উইগি

20

এখানে আপনি কীভাবে একটি কাঠামো তৈরি করতে পারেন তার একটি উদাহরণ যা ত্রুটি বার্তাকে "সুরক্ষিত মেমরিটি পড়ার বা লেখার চেষ্টা করা হয়েছে This এটি প্রায়শই একটি ইঙ্গিত যা অন্য স্মৃতিটি দূষিত।" সাফল্য এবং ব্যর্থতার মধ্যে পার্থক্যটি খুব সূক্ষ্ম।

নিম্নলিখিত ইউনিট পরীক্ষাটি সমস্যাটি দেখায়।

কী ভুল হয়েছে তা আপনি কাজ করতে পারেন কিনা দেখুন।

    [Test]
    public void Test()
    {
        var bar = new MyClass
        {
            Foo = 500
        };
        bar.Foo += 500;

        Assert.That(bar.Foo.Value.Amount, Is.EqualTo(1000));
    }

    private class MyClass
    {
        public MyStruct? Foo { get; set; }
    }

    private struct MyStruct
    {
        public decimal Amount { get; private set; }

        public MyStruct(decimal amount) : this()
        {
            Amount = amount;
        }

        public static MyStruct operator +(MyStruct x, MyStruct y)
        {
            return new MyStruct(x.Amount + y.Amount);
        }

        public static MyStruct operator +(MyStruct x, decimal y)
        {
            return new MyStruct(x.Amount + y);
        }

        public static implicit operator MyStruct(int value)
        {
            return new MyStruct(value);
        }

        public static implicit operator MyStruct(decimal value)
        {
            return new MyStruct(value);
        }
    }

আমার মাথা ব্যাথা করছে ... কেন এই কাজ হয় না?
জেসনহ

2
এইচএম আমি কয়েক মাস আগে এটি লিখেছিলাম, তবে কেন ঠিক হয়েছিল তা আমি মনে করতে পারি না।
সিবিপি

10
সংকলক বাগের মতো দেখতে; += 500কল: ldc.i4 500(একটি Int32 যেমন 500 পাহাড় জমে), তারপর call valuetype Program/MyStruct Program/MyStruct::op_Addition(valuetype Program/MyStruct, valuetype [mscorlib]System.Decimal)- তাই তখন হিসেবে একইরূপে decimalকোনো রূপান্তর ছাড়া (96 বিট)। আপনি যদি += 500Mএটি ব্যবহার করেন এটি সঠিক হয়। এটি দেখতে সহজ মনে হয় যেমন সংকলক মনে করে এটি এটি এক উপায়ে করতে পারে (সম্ভবত অন্তর্নিহিত ইনট অপারেটরের কারণে) এবং তারপরে এটি অন্যভাবে করার সিদ্ধান্ত নিয়েছে।
মার্ক গ্র্যাভেল

1
দ্বৈত পোস্টের জন্য দুঃখিত, এখানে আরও যোগ্য ব্যাখ্যা। আমি এটিকে যুক্ত করব, আমি এটির দ্বারা কিছুটা কমে এসেছি এবং এটি এটি সফল হয়, যদিও আমি বুঝতে পারি কেন এটি ঘটে। আমার কাছে এটি স্ট্রাক্ট / ভ্যালুটিটাইপের দুর্ভাগ্যজনক সীমাবদ্ধতা। bytes.com/topic/net/answers/…
বেনিট ডিল

2
@ সংকলক ত্রুটি পেয়েছে বা মূল কাঠামোকে প্রভাবিত করছে না এমন পরিবর্তন ঠিক আছে। অ্যাক্সেস লঙ্ঘন করা একেবারে আলাদা জন্তু। আপনি কেবল নিরাপদ খাঁটি পরিচালিত কোড লিখলে রানটাইম কখনও এড়াতে হবে না।
কোডসইনচাওস

18

সি # অ্যারে এবং তালিকার মধ্যে রূপান্তরকে সমর্থন করে যতক্ষণ না অ্যারেগুলি বহুমাত্রিক না হয় এবং প্রকারগুলির মধ্যে উত্তরাধিকারের সম্পর্ক থাকে এবং প্রকারগুলি রেফারেন্স ধরণের হয়

object[] oArray = new string[] { "one", "two", "three" };
string[] sArray = (string[])oArray;

// Also works for IList (and IEnumerable, ICollection)
IList<string> sList = (IList<string>)oArray;
IList<object> oList = new string[] { "one", "two", "three" };

মনে রাখবেন যে এটি কাজ করে না:

object[] oArray2 = new int[] { 1, 2, 3 }; // Error: Cannot implicitly convert type 'int[]' to 'object[]'
int[] iArray = (int[])oArray2;            // Error: Cannot convert type 'object[]' to 'int[]'

11
IList <T> উদাহরণটি কেবল একটি কাস্ট, কারণ স্ট্রিং [] ইতিমধ্যে আইসি্লোনেবল, আইলিস্ট, আইকোলিকেশন, আইনিমেবল, আইলিস্ট <স্ট্রিং>, আইকোলিকেশন <স্ট্রিং> এবং আইনিউবারেবল <স্ট্রিং> প্রয়োগ করে।
লুকাস

15

দুর্ঘটনার মুখোমুখি হওয়া এটিই আজব:

public class DummyObject
{
    public override string ToString()
    {
        return null;
    }
}

নিম্নলিখিত হিসাবে ব্যবহৃত:

DummyObject obj = new DummyObject();
Console.WriteLine("The text: " + obj.GetType() + " is " + obj);

নিক্ষেপ করবে a NullReferenceException। দেখা যাচ্ছে যে একাধিক সংযোজন সি # সংকলক দ্বারা একটি কলটিতে সংকলিত হয়েছে String.Concat(object[])। .NET 4 এর পূর্বে কনক্যাটের ঠিক ওভারলোডে একটি বাগ রয়েছে যেখানে অবজেক্টটি নাল জন্য পরীক্ষা করা হয়, তবে টসস্ট্রিং () এর ফলাফল নয়:

object obj2 = args[i];
string text = (obj2 != null) ? obj2.ToString() : string.Empty;
// if obj2 is non-null, but obj2.ToString() returns null, then text==null
int length = text.Length;

এটি ECMA-334 414.7.4 এর একটি বাগ:

বাইনারি + অপারেটর স্ট্রিং সংমিশ্রণ সম্পাদন করে যখন এক বা উভয় অপারেশন টাইপ করা হয় string। যদি স্ট্রিং কনটেনটেশনের অপারেন্ড হয় null, একটি খালি স্ট্রিং প্রতিস্থাপন করা হয়। অন্যথায়, কোনও নন-স্ট্রিং অপারেন্ডকে ToStringটাইপ থেকে উত্তরাধিকারসূত্রে প্রাপ্ত ভার্চুয়াল পদ্ধতিটি শুরু করে তার স্ট্রিং উপস্থাপনায় রূপান্তর করা হয় objectযদি ToStringফিরে আসে null, একটি খালি স্ট্রিং প্রতিস্থাপন করা হয়।


3
হুম, তবে আমি এই .ToStringদোষটি কল্পনা করতে পারি কারণ সত্যই কখনই শূন্য হওয়া উচিত নয়, তবে স্ট্রিং E এমপিটি। তবুও ফ্রেমওয়ার্কে ত্রুটি।
ডাইকাম

12

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

var method = new DynamicMethod("Test", null, null);
var il = method.GetILGenerator();

il.Emit(OpCodes.Ldc_I4_0);
il.Emit(OpCodes.Newarr, typeof(char));
il.Emit(OpCodes.Newobj, typeof(string).GetConstructor(new[] { typeof(char[]) }));

il.Emit(OpCodes.Ldc_I4_0);
il.Emit(OpCodes.Newarr, typeof(char));
il.Emit(OpCodes.Newobj, typeof(string).GetConstructor(new[] { typeof(char[]) }));

il.Emit(OpCodes.Call, typeof(object).GetMethod("ReferenceEquals"));
il.Emit(OpCodes.Box, typeof(bool));
il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new[] { typeof(object) }));

il.Emit(OpCodes.Ret);

method.Invoke(null, null);

আপনি trueযদি এর বিরুদ্ধে পরীক্ষা করে থাকেন তার string.Emptyঅর্থ এটিও সমান হয় যে খালি স্ট্রিংগুলিতে এই অপ-কোডটির অবশ্যই বিশেষ আচরণ থাকতে হবে।


স্মার্ট আলেক বা অন্য কিছু হতে হবে না তবে আপনি কি প্রতিফলকের কথা শুনেছেন ? এই ধরণের ক্ষেত্রে এটি বেশ সহজ;
আরসিআইএক্স

3
আপনি স্মার্ট হচ্ছেন না; আপনি বিন্দুটি মিস করছেন - আমি এই একটি মামলার জন্য নির্দিষ্ট আইএল তৈরি করতে চেয়েছিলাম। এবং যাইহোক, যে প্রতিচ্ছবি। এমিটি এই ধরণের দৃশ্যের জন্য তুচ্ছ, এটি সম্ভবত সি # তে একটি প্রোগ্রাম লেখার মত তাত্পর্যপূর্ণ এবং তারপরে রিফ্লেক্টরটি খোলার, বাইনারি সন্ধান করার, পদ্ধতিটি আবিষ্কার করার ... এবং আমার এমনকি দরকারও নেই এটি করতে আইডিই ছেড়ে দিন।
গ্রেগ বিচ

10
Public Class Item
   Public ID As Guid
   Public Text As String

   Public Sub New(ByVal id As Guid, ByVal name As String)
      Me.ID = id
      Me.Text = name
   End Sub
End Class

Public Sub Load(sender As Object, e As EventArgs) Handles Me.Load
   Dim box As New ComboBox
   Me.Controls.Add(box)          'Sorry I forgot this line the first time.'
   Dim h As IntPtr = box.Handle  'Im not sure you need this but you might.'
   Try
      box.Items.Add(New Item(Guid.Empty, Nothing))
   Catch ex As Exception
      MsgBox(ex.ToString())
   End Try
End Sub

আউটপুটটি "সুরক্ষিত মেমোরিটি পড়ার চেষ্টা করা হয় an এটি অন্যান্য ইঙ্গিতটি দূষিত হওয়ার ইঙ্গিত।"


1
মজাদার! সংকলক বাগের মতো শোনাচ্ছে, যদিও; আমি সি # তে পোর্ট করেছি এবং এটি ঠিকঠাক কাজ করে। এটি বলেছিল, লোডে ফেলে দেওয়া ব্যতিক্রমগুলি নিয়ে অনেকগুলি সমস্যা রয়েছে এবং এটি কোনও ডিবাগারের সাথে / ছাড়া আলাদাভাবে আচরণ করে - আপনি কোনও ডিবাগার দিয়ে ধরতে পারেন, তবে (কিছু ক্ষেত্রে) ছাড়াই নয়।
মার্ক গ্র্যাভেল

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

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

1
এটি উপরে একই সিবিপি সমস্যা। যে মূল্যবান মূল্য ফেরানো হচ্ছে তা একটি অনুলিপি, অতএব বলে দেওয়া অনুলিপি থেকে প্রাপ্ত কোনও সম্পত্তি সম্পর্কিত যে কোনও রেফারেন্স বিট-বালতি জমি নিয়ে চলেছে
বেনেট ডিল

1
নাঃ। এখানে কোন স্ট্রাইক নেই। আমি আসলে এটি ডিবাগ করেছি। এটি বিলম্বিত ক্রাশের ফলে দেশীয় কম্বো বাক্সের তালিকা আইটেম সংগ্রহের জন্য একটি NULL যুক্ত করে।
জোশুয়া

10

প্রপার্টিআইএনফো.সেটভ্যালু () এনটগুলিকে ইনট, এনটগুলিকে অন্তর্ভুক্ত করতে পারে এনটগুলিকে এনালগুলিতে এনালগুলিতে এনট করতে পারে, তবে এনালগুলিকে অবিচ্ছিন্ন করতে পারে না।

enumProperty.SetValue(obj, 1, null); //works
nullableIntProperty.SetValue(obj, 1, null); //works
nullableEnumProperty.SetValue(obj, MyEnum.Foo, null); //works
nullableEnumProperty.SetValue(obj, 1, null); // throws an exception !!!

এখানে সম্পূর্ণ বিবরণ


10

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

class TwoWayRelationship<T1, T2>
{
    public T2 Get(T1 key) { /* ... */ }
    public T1 Get(T2 key) { /* ... */ }
}

আপনি কোথায় T1এবং T2বিভিন্ন ধরণের একটি উদাহরণ তৈরি করলে সবই ভাল :

var r1 = new TwoWayRelationship<int, string>();
r1.Get(1);
r1.Get("a");

তবে T1এবং যদি T2একই হয় (এবং সম্ভবত যদি এটি অন্যের সাবক্লাস ছিল) তবে এটি একটি সংকলক ত্রুটি:

var r2 = new TwoWayRelationship<int, int>();
r2.Get(1);  // "The call is ambiguous..."

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


পদ্ধতির ওভারলোডিংয়ের বিরোধীরা এটি পছন্দ করবে ^^
খ্রিস্টান ক্লাউজার

1
আমি জানি না, এটি আমার কাছে মোটামুটি বোঝায়।
স্কট হুইটলক

10

সি # অ্যাক্সেসিবিলিটি পাজলার


নিম্নলিখিত উত্পন্ন ক্লাসটি তার বেস শ্রেণি থেকে একটি ব্যক্তিগত ক্ষেত্র অ্যাক্সেস করছে এবং সংকলকটি নিঃশব্দে অন্য দিকে তাকিয়ে আছে:

public class Derived : Base
{
    public int BrokenAccess()
    {
        return base.m_basePrivateField;
    }
}

ক্ষেত্রটি প্রকৃতপক্ষে ব্যক্তিগত:

private int m_basePrivateField = 0;

অনুমান করার জন্য যত্ন কীভাবে আমরা এই জাতীয় কোডটি সংকলন করতে পারি?

উত্তর


কৌশলটি এর Derivedঅভ্যন্তরীণ শ্রেণি হিসাবে ঘোষণা করা Base:

public class Base
{
    private int m_basePrivateField = 0;

    public class Derived : Base
    {
        public int BrokenAccess()
        {
            return base.m_basePrivateField;
        }
    }
}

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


এটি আসলে ভালভাবে নথিভুক্ত; এমএসডিএন.মাইক্রোসফট.এইন.উস / লিবারিয়ান/ms173120%28VS.80%29.aspx । এটি সময়ে দরকারী বৈশিষ্ট্য হতে পারে, বিশেষত যদি বাইরের শ্রেণি স্থির থাকে।

হ্যাঁ - অবশ্যই এটি নথিভুক্ত যাইহোক, খুব কম লোকই এই ধাঁধাটি সমাধান করেছে তাই আমি ভেবেছিলাম এটি ট্রিভিয়ার একটি দুর্দান্ত অংশ।
ওমর মোড়

2
দেখে মনে হচ্ছে আপনি কোনও অভ্যন্তর শ্রেণীর মালিকের উত্তরাধিকারী হয়ে স্ট্যাকের উপচে
পড়ার

তবুও অন্য একটি অনুরূপ (এবং পুরোপুরি সঠিক) কেসটি হ'ল কোনও বস্তু একই ধরণের অন্য কোনও অবজেক্টের ব্যক্তিগত সদস্যকে অ্যাক্সেস করতে পারে:class A { private int _i; public void foo(A other) { int res = other._i; } }
অলিভিয়ার জ্যাকট-ডেসকোম্বেস

10

সবেমাত্র একটি সুন্দর ছোট্ট জিনিস খুঁজে পেয়েছি:

public class Base
{
   public virtual void Initialize(dynamic stuff) { 
   //...
   }
}
public class Derived:Base
{
   public override void Initialize(dynamic stuff) {
   base.Initialize(stuff);
   //...
   }
}

এটি সংকলন ত্রুটি ছুড়ে ফেলে।

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

যদি আমি বেস লিখি nInitialize (অবজেক্ট হিসাবে স্টাফ); এটি নিখুঁতভাবে কাজ করে, তবে এটি এখানে একটি "যাদু শব্দ" বলে মনে হচ্ছে, যেহেতু এটি ঠিক একই রকম, তাই এখনও সবকিছু গতিশীল হিসাবে পুনরুদ্ধার করা হয়েছে ...


8

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

সুতরাং এই API এর ব্যবহারকারীর এর মতো কিছু কোড থাকতে পারে:

return test != null ? test : GetDefault();

অথবা সম্ভবত কিছুটা আরও ভার্বোজ, এটি:

if (test == null)
    return GetDefault();
return test;

GetDefault()এমন একটি পদ্ধতি যেখানে কিছু ডিফল্ট মান ফিরে আসে যা আমরা পরিবর্তে ব্যবহার করতে চাই null। আমি যখন রিশ্যার্পার ব্যবহার করছিলাম এবং এর যে কোনওটি নিম্নলিখিতটিতে পুনর্লিখনের সুপারিশ অনুসরণ করছিলাম তখন অবাক করে দিয়েছিলাম:

return test ?? GetDefault();

যদি পরীক্ষার অবজেক্টটি কোনও যথাযথ পরিবর্তে এপিআই থেকে ফিরে আসা একটি নাল বস্তু হয় তবে কোডটির nullআচরণ এখন পরিবর্তিত হয়েছে, নাল কোলেসিং অপারেটর প্রকৃতপক্ষে যাচাই করছে null, চালাচ্ছে না operator=বা এর জন্য যাচাই করে Equals()


1
আসলেই কোন # কর্নারের কেস নয়, প্রিয়তম হুজুর কে ভেবেছেন?!?
রায় বুয়সেন

এই কোডটি কি কেবল ক্ষয়যোগ্য প্রকারগুলি ব্যবহার করে না? সুতরাং রিশার্পার "??" সুপারিশ করছেন ব্যবহার করুন। রায় যেমন বলেছিল, আমি এটিকে কোনও কর্নার ক্ষেত্রে ভাবিনি; আমি নাকি ভুল করছি?
টনি

1
হ্যাঁ, প্রকারগুলি হ্রাসযোগ্য - এবং এটির সাথে একটি নালওবজেক্ট রয়েছে। এটি যদি কোন কোণে হয় তবে আমি জানি না তবে কমপক্ষে এটি এমন একটি ক্ষেত্রে যেখানে 'যদি (ক! = নাল) ফিরে আসে; ফিরতি খ; ' 'রিটার্ন এ' এর মতো নয় কি? খ '। আমি ফ্রেমওয়ার্ক / এপিআই ডিজাইনের সাথে এটি সম্পূর্ণরূপে একমত - ওভারলোডিং == কোনও জিনিসে সত্য ফিরে আসা নালার পক্ষে অবশ্যই ভাল ধারণা নয়!
টর লিভার

8

এই অদ্ভুত ক্ষেত্রে বিবেচনা করুন:

public interface MyInterface {
  void Method();
}
public class Base {
  public void Method() { }
}
public class Derived : Base, MyInterface { }

যদি Baseএবং Derivedএকই সমাবেশে ঘোষিত Base::Methodহয় তবে সংকলকটি ভার্চুয়াল এবং সিল করে দেবে (সিআইএল-তে), যদিওBase ইন্টারফেসটি কার্যকর করে না।

যদি Baseএবং Derivedবিভিন্ন সমাবেশে থাকে, অ্যাসেম্বলিকে সংকলন করার সময়, সংকলকটি Derivedঅন্য সমাবেশটি পরিবর্তন করবে না, সুতরাং এটিতে কোনও সদস্যকে পরিচয় করিয়ে দেওয়া হবে এটির Derivedজন্য একটি স্পষ্ট বাস্তবায়ন MyInterface::Methodহবে কেবল কলটি অর্পণ করবে Base::Method

ইন্টারফেসের ক্ষেত্রে পলিমারফিক প্রেরণকে সমর্থন করার জন্য এই সংকলকটিকে এটি করতে হবে, অর্থাত্ সেই পদ্ধতিটিকে ভার্চুয়াল করে তুলতে হবে।


এটা সত্যিই বিজোড় শব্দ না। পরে তদন্ত করতে হবে :)
জন স্কিটে

@ জোন স্কিটি: সি # তে ভূমিকার জন্য বাস্তবায়ন কৌশল নিয়ে গবেষণা করার সময় আমি এটি পেয়েছি । আপনার মতামত পেতে দুর্দান্ত হবে!
জর্দো

7

নিম্নলিখিতটি সাধারণ জ্ঞান হতে পারে আমার কেবলই অভাব ছিল, তবে হ্যাঁ but কিছু সময় আগে, আমাদের একটি বাগ কেস হয়েছিল যা ভার্চুয়াল বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করে। প্রসঙ্গে কিছুটা বিমূর্ত করা, নিম্নলিখিত কোডটি বিবেচনা করুন এবং নির্দিষ্ট অঞ্চলে ব্রেকপয়েন্টটি প্রয়োগ করুন:

class Program
{
    static void Main(string[] args)
    {
        Derived d = new Derived();
        d.Property = "AWESOME";
    }
}

class Base
{
    string _baseProp;
    public virtual string Property 
    { 
        get 
        {
            return "BASE_" + _baseProp;
        }
        set
        {
            _baseProp = value;
            //do work with the base property which might 
            //not be exposed to derived types
            //here
            Console.Out.WriteLine("_baseProp is BASE_" + value.ToString());
        }
    }
}

class Derived : Base
{
    string _prop;
    public override string Property 
    {
        get { return _prop; }
        set 
        { 
            _prop = value; 
            base.Property = value;
        } //<- put a breakpoint here then mouse over BaseProperty, 
          //   and then mouse over the base.Property call inside it.
    }

    public string BaseProperty { get { return base.Property; } private set { } }
}

Derivedঅবজেক্ট প্রসঙ্গে থাকাকালীন আপনি base.Propertyকোনও ঘড়ি হিসাবে টাইপ করার সময় বা টাইপ করার সময় একই আচরণ পেতে পারেনbase.Property কুইকওয়াচে ।

কি চলছে তা বুঝতে আমাকে কিছুটা সময় নিল। শেষ পর্যন্ত আমি কুইকওয়াচ দ্বারা আলোকিত হয়েছি। কুইকওয়াচে যাওয়ার সময় এবং Derivedঅবজেক্ট d (বা বস্তুর প্রসঙ্গ থেকে this) অন্বেষণ এবং ক্ষেত্রটি নির্বাচন করার baseসময়, কুইকওয়াচের শীর্ষে সম্পাদনা ক্ষেত্রটি নিম্নলিখিত কাস্টটি প্রদর্শন করে:

((TestProject1.Base)(d))

যার অর্থ হ'ল যদি বেসটি এরূপে প্রতিস্থাপন করা হয় তবে কল হবে

public string BaseProperty { get { return ((TestProject1.Base)(d)).Property; } private set { } }

ওয়াচেস, কুইকওয়াচ এবং ডিবাগিং মাউস-ওভার টুলটিপসের জন্য, এবং তারপরে পলিমারফিজম বিবেচনা করার "AWESOME"পরিবর্তে এটি প্রদর্শিত হবে "BASE_AWESOME"বলে মনে হয়। আমি এখনও নিশ্চিত নই কেন এটি কেন এটি একটি castালাইতে রূপান্তরিত করবে, একটি অনুমানটি হ'ল এটি callমডিউলগুলির প্রসঙ্গ থেকে পাওয়া যায় না এবং কেবল callvirt

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

"ওয়, অপেক্ষা করুন .. কি? ওএমজি যে ডিএলএল এর মত, .. মজার কিছু"


এটি বিশেষ কিছু নয়, এটি কেবল কাজকে ওভাররাইড করে।
Configurator

7

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Remoting.Proxies;
using System.Reflection;
using System.Runtime.Remoting.Messaging;

namespace BrokenProxy
{
    class NotAnIAsyncResult
    {
        public string SomeProperty { get; set; }
    }

    class BrokenProxy : RealProxy
    {
        private void HackFlags()
        {
            var flagsField = typeof(RealProxy).GetField("_flags", BindingFlags.NonPublic | BindingFlags.Instance);
            int val = (int)flagsField.GetValue(this);
            val |= 1; // 1 = RemotingProxy, check out System.Runtime.Remoting.Proxies.RealProxyFlags
            flagsField.SetValue(this, val);
        }

        public BrokenProxy(Type t)
            : base(t)
        {
            HackFlags();
        }

        public override IMessage Invoke(IMessage msg)
        {
            var naiar = new NotAnIAsyncResult();
            naiar.SomeProperty = "o noes";
            return new ReturnMessage(naiar, null, 0, null, (IMethodCallMessage)msg);
        }
    }

    interface IRandomInterface
    {
        int DoSomething();
    }

    class Program
    {
        static void Main(string[] args)
        {
            BrokenProxy bp = new BrokenProxy(typeof(IRandomInterface));
            var instance = (IRandomInterface)bp.GetTransparentProxy();
            Func<int> doSomethingDelegate = instance.DoSomething;
            IAsyncResult notAnIAsyncResult = doSomethingDelegate.BeginInvoke(null, null);

            var interfaces = notAnIAsyncResult.GetType().GetInterfaces();
            Console.WriteLine(!interfaces.Any() ? "No interfaces on notAnIAsyncResult" : "Interfaces");
            Console.WriteLine(notAnIAsyncResult is IAsyncResult); // Should be false, is it?!
            Console.WriteLine(((NotAnIAsyncResult)notAnIAsyncResult).SomeProperty);
            Console.WriteLine(((IAsyncResult)notAnIAsyncResult).IsCompleted); // No way this works.
        }
    }
}

আউটপুট:

No interfaces on notAnIAsyncResult
True
o noes

Unhandled Exception: System.EntryPointNotFoundException: Entry point was not found.
   at System.IAsyncResult.get_IsCompleted()
   at BrokenProxy.Program.Main(String[] args) 

6

আমি নিশ্চিত নই যে আপনি যদি এটি একটি উইন্ডোজ ভিস্তা / 7 বিজোড়তা বা একটি। নেট বিজোড়তা বলে থাকেন তবে এটি আমাকে কিছুক্ষণের জন্য আমার মাথা আঁচড়ান।

string filename = @"c:\program files\my folder\test.txt";
System.IO.File.WriteAllText(filename, "Hello world.");
bool exists = System.IO.File.Exists(filename); // returns true;
string text = System.IO.File.ReadAllText(filename); // Returns "Hello world."

উইন্ডোজ ভিস্তা / 7 এ ফাইলটি আসলে লিখিত হবে C:\Users\<username>\Virtual Store\Program Files\my folder\test.txt


2
এটি প্রকৃতপক্ষে একটি ভিস্তা (7, আফিক নয়) সুরক্ষা বর্ধন। তবে দুর্দান্ত জিনিসটি হ'ল আপনি প্রোগ্রাম ফাইলের পাথ দিয়ে ফাইলটি পড়তে এবং খুলতে পারবেন, আপনি যদি সেখানে এক্সপ্লোরারের সাথে দেখেন তবে কিছুই নেই। অবশেষে এটির সন্ধান করার আগে এই একজন আমাকে প্রায় একদিন কাজ করেছেন @ গ্রাহক হিসাবে took
হেনরি

এটি অবশ্যই একটি উইন্ডোজ 7 জিনিস। আমি যখন এটিতে দৌড়ালাম তখন আমি এটি ব্যবহার করছিলাম। আমি এর পিছনে যুক্তিটি বুঝতে পারি তবে এটি বের করতে এখনও হতাশাব্যঞ্জক ছিল।
স্পেনসার রুপোর্ট

ভিস্তা / উইন In-এ (প্রযুক্তিগতভাবে উইনএক্সপি) অ্যাপ্লিকেশনগুলির প্রযুক্তিগতভাবে ব্যবহারকারীর ডেটা হিসাবে ব্যবহারকারী-ফোল্ডার জমিতে একটি অ্যাপডেটা ফোল্ডারে লিখতে হবে। অ্যাপ্লিকেশনগুলিতে প্রোগ্রামফিল / উইন্ডোজ / সিস্টেম 32 / ইত্যাদিগুলিতে কখনও লেখা উচিত নয়, যদি না তাদের প্রশাসক প্রাইভেলিজ থাকে এবং সেগুলি থেকে প্রোগ্রামগুলি আপগ্রেড করার / আনইনস্টল করার / নতুন বৈশিষ্ট্য ইনস্টল করার কথা বলা উচিত। কিন্ত! তবুও সিস্টেম 32 / উইন্ডোজ / ইত্যাদিতে লিখবেন না :) আপনি যদি উপরে কোডটি অ্যাডমিন হিসাবে চালিয়ে থাকেন তবে (অ্যাডমিন হিসাবে ডান ক্লিক করুন> চালানো) এটি তাত্ত্বিকভাবে প্রোগ্রাম ফাইল অ্যাপ্লিকেশন ফোল্ডারে লিখতে হবে।
স্টিভ সাইফুহস

ভার্চুয়ালাইজেশনের মতো শব্দগুলি - ক্রাইপিবিট.স্পেস.লাইভ.com
কলিন

6

আপনি কি কখনও ভেবে দেখেছেন যে সি # সংকলকটি অবৈধ সিআইএল তৈরি করতে পারে? এটি চালান এবং আপনি একটি পাবেন TypeLoadException:

interface I<T> {
  T M(T p);
}
abstract class A<T> : I<T> {
  public abstract T M(T p);
}
abstract class B<T> : A<T>, I<int> {
  public override T M(T p) { return p; }
  public int M(int p) { return p * 2; }
}
class C : B<int> { }

class Program {
  static void Main(string[] args) {
    Console.WriteLine(new C().M(42));
  }
}

যদিও আমি জানি না এটি সি # 4.0 সংকলকটিতে কীভাবে ভাড়া fares

সম্পাদনা : এটি আমার সিস্টেম থেকে আউটপুট:

C:\Temp>type Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1 {

  interface I<T> {
    T M(T p);
  }
  abstract class A<T> : I<T> {
    public abstract T M(T p);
  }
  abstract class B<T> : A<T>, I<int> {
    public override T M(T p) { return p; }
    public int M(int p) { return p * 2; }
  }
  class C : B<int> { }

  class Program {
    static void Main(string[] args) {
      Console.WriteLine(new C().M(11));
    }
  }

}
C:\Temp>csc Program.cs
Microsoft (R) Visual C# 2008 Compiler version 3.5.30729.1
for Microsoft (R) .NET Framework version 3.5
Copyright (C) Microsoft Corporation. All rights reserved.


C:\Temp>Program

Unhandled Exception: System.TypeLoadException: Could not load type 'ConsoleAppli
cation1.C' from assembly 'Program, Version=0.0.0.0, Culture=neutral, PublicKeyTo
ken=null'.
   at ConsoleApplication1.Program.Main(String[] args)

C:\Temp>peverify Program.exe

Microsoft (R) .NET Framework PE Verifier.  Version  3.5.30729.1
Copyright (c) Microsoft Corporation.  All rights reserved.

[token  0x02000005] Type load failed.
[IL]: Error: [C:\Temp\Program.exe : ConsoleApplication1.Program::Main][offset 0x
00000001] Unable to resolve token.
2 Error(s) Verifying Program.exe

C:\Temp>ver

Microsoft Windows XP [Version 5.1.2600]

সি # 3.5 সংকলক এবং সি # 4 সংকলক উভয়ই আমার জন্য কাজ করে ...
জন স্কিটি

আমার সিস্টেমে এটি কাজ করে না। আমি প্রশ্নের আউটপুট পেস্ট করব।
জর্দো

এটি নেট নেট in.৫ এ আমার জন্য ব্যর্থ হয়েছিল (৪.০ পরীক্ষার সময় নেই)। এবং আমি ভিবি.এনইটি কোড দিয়ে সমস্যাটি প্রতিলিপি করতে পারি।
মার্ক হার্ট

3

C # সম্পর্কে সত্যিই উত্তেজনাপূর্ণ কিছু রয়েছে যা এটি ক্লোজারগুলি পরিচালনা করে।

স্ট্যাক ভেরিয়েবলের মানগুলি ক্লোজার ফ্রি ভেরিয়েবলের অনুলিপি করার পরিবর্তে, এটি প্রিপ্রসেসর যাদুটি ভেরিয়েবলের সমস্ত উপস্থিতিকে একটি বস্তুতে আবৃত করে এবং সুতরাং এটি স্ট্যাকের বাইরে সরায় - সরাসরি গাদা হয়ে! :)

আমার ধারণা, এটি সি # আরও এমএল-এর চেয়ে বেশি কার্যকরী-সম্পূর্ণ (বা ল্যাম্বদা-সম্পূর্ণ হু) ভাষা তৈরি করে (যা স্ট্যাকের মান অনুলিপি এএএফআইকে ব্যবহার করে)। সি # এর মতো, এফ # এরও বৈশিষ্ট্য রয়েছে।

এটি আমার জন্য অনেক আনন্দ এনেছে, ধন্যবাদ এমএস ছেলেরা!

যদিও এটি কোনও অদ্ভুততা বা কোণার বিষয় নয় ... তবে স্ট্যাক-ভিত্তিক ভিএম ভাষা থেকে সত্যই অপ্রত্যাশিত কিছু :)


3

একটি প্রশ্ন থেকে আমি খুব বেশি আগে জিজ্ঞাসা করেছি:

শর্তসাপেক্ষ অপারেটর স্পষ্টভাবে কাস্ট করতে পারবেন না?

প্রদত্ত:

Bool aBoolValue;

কোথায় aBoolValue সত্য বা মিথ্যা নির্ধারিত হয়েছে;

নিম্নলিখিতগুলি সংকলন করবে না:

Byte aByteValue = aBoolValue ? 1 : 0;

তবে এটি হবে:

Int anIntValue = aBoolValue ? 1 : 0;

প্রদত্ত উত্তরটিও বেশ ভাল।


যদিও আমি ve not test it Iনিশ্চিত যে এটি কাজ করবে: বাইট aByteValue = aBoolValue? (বাইট) 1: (বাইট) 0; বা: বাইট এবাইটভ্যালু = (বাইট) (aBoolValue? 1: 0);
অ্যালেক্স প্যাকুরার

2
হ্যাঁ, অ্যালেক্স, এটি কাজ করবে। কীটি অন্তর্নিহিত কাস্টিংয়ে রয়েছে। 1 : 0একা বাইটকে নয়, অন্তর্নিহিতভাবে অন্তর্ভুক্ত করা হবে।
এমপিলেটিয়ার

2

সি # তে থাকা স্কোপিংটি অনেক সময় সত্যই উদ্ভট হয়। আমাকে একটি উদাহরণ দেয়:

if (true)
{
   OleDbCommand command = SQLServer.CreateCommand();
}

OleDbCommand command = SQLServer.CreateCommand();

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


34
আমি এটি বিশেষভাবে উদ্ভট হিসাবে দেখছি না। আপনি আপনার ব্লগে যাকে "নিখুঁতভাবে সঠিক কোড" বলছেন তা ভাষা স্পেসিফিকেশন অনুসারে পুরোপুরি ভুল । এটা কিছু কাল্পনিক আপনি যে ভাষায় চাই সঠিক হতে পারে মত হতে সি #, কিন্তু ভাষা বৈশিষ্ট বেশ স্পষ্ট যে C # এতে অবৈধ হয়।
জন স্কিটি

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

6
সি #! = সি / সি ++। আপনি কি কোট ব্যবহার করতে চান << "হ্যালো ওয়ার্ল্ড!" << শেষ; কনসোলের পরিবর্তে.রাইটলাইন ("হ্যালো ওয়ার্ল্ড!") ;? এছাড়াও এটি অযৌক্তিক নয়, কেবল অনুমানটি পড়ুন।
ক্রেডেন্স

9
আমি স্কোপিং বিধি সম্পর্কে বলছি যা ভাষার মূল অংশ। আপনি স্ট্যান্ডার্ড লাইব্রেরি সম্পর্কে বলছেন। তবে এটি এখন আমার কাছে স্পষ্ট হয়েছে যে আমি সি # ভাষার ছোট্ট স্পেসিফিকেশনটি এতে প্রোগ্রামিং শুরু করার আগেই কেবল আমার পড়া উচিত।
অ্যান্ডারস রুন জেনসেন

6
এরিক লিপার্ট প্রকৃতপক্ষে সম্প্রতি # এর মতো কেন ডিজাইন করা হয়েছে তার কারণগুলি পোস্ট করেছেন: ব্লগস.এমএসএনএন / পেরিক্লিপার্ট / অর্চিভ / ২০০৯ / 11 / 02/… । সংক্ষিপ্তসারটি হ'ল কারণ সম্ভবত এর পরিবর্তনগুলির অনিচ্ছাকৃত পরিণতি ঘটবে less
হেলিফ্যান্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.