.NET 4.5 বিটাতে এই ফ্যাটাল্যাক্সিউশনএজাইনআরারের কারণ কী? [বন্ধ]


150

নীচের নমুনা কোডটি স্বাভাবিকভাবেই ঘটেছে। হঠাৎ আমার কোডটি একটি খুব বাজে-বাজে FatalExecutionEngineErrorব্যতিক্রম। আমি অপরাধীর নমুনাটি আলাদা এবং কমানোর চেষ্টা করে 30 মিনিট সময় ব্যয় করেছি। কনসোল অ্যাপ্লিকেশন হিসাবে ভিজ্যুয়াল স্টুডিও 2012 ব্যবহার করে এটি সঙ্কলন করুন:

class A<T>
{
    static A() { }

    public A() { string.Format("{0}", string.Empty); }
}

class B
{
    static void Main() { new A<object>(); }
}

.NET ফ্রেমওয়ার্ক 4 এবং 4.5 এ এই ত্রুটিটি উত্পন্ন করা উচিত:

ফ্যাটাল্যাক্সিউশনএক্সেপশন স্ক্রিনশট

এটি কি একটি জানা ত্রুটি, এর কারণ কী এবং এটি প্রশমিত করার জন্য আমি কী করতে পারি? আমার চারপাশের বর্তমান কাজগুলি ব্যবহার না করা string.Empty, তবে আমি কি ভুল গাছটি ছাঁটাই করছি? সেই কোডটি সম্পর্কে যে কোনও কিছু পরিবর্তন করা আপনার প্রত্যাশার মতোই এটি কার্যকর করে তোলে - উদাহরণস্বরূপ, খালি স্ট্যাটিক নির্মাণকারীকে অপসারণ করা A, বা থেকে পরামিতি থেকে টাইপ পরিবর্তন objectকরা int

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

আমার ল্যাপটপটি ফ্রেমওয়ার্ক ৪.০ এর সাথে উপরের মত একই কোডের সাথে ক্র্যাশ হয়েছিল তবে 4.5 সহ প্রধান ক্র্যাশ হয়েছে। উভয় সিস্টেমই সর্বশেষ আপডেটগুলি (জুলাই?) এর সাথে VS'12 ব্যবহার করছে।

আরও তথ্য :

  • আইএল কোড (সংকলিত ডিবাগ / যে কোনও সিপিইউ / 4.0 / ভিএস 2010 (আইডিই বিষয়টি বিবেচনা করা উচিত নয়?)): Http://codepad.org/boZDd98E
  • 4.0 এর সাথে ভিএস 2010 দেখা যায়নি। অপ্টিমাইজেশন সহ / ছাড়াই ক্র্যাশ না করা, বিভিন্ন টার্গেট সিপিইউ, ডিবাগার সংযুক্ত / সংযুক্ত নয়, ইত্যাদি Tim টিম মেডোরা
  • আমি যদি কোনও সিসিপিইউ ব্যবহার করি তবে ২০১০ সালে ক্র্যাশগুলি, x86 এ ঠিক আছে। প্ল্যাটফর্ম টার্গেট = যেকোনো সিপিইউ ব্যবহার করে ভিজ্যুয়াল স্টুডিও 2010 এসপি 1-এ ক্র্যাশ হয়েছে তবে প্ল্যাটফর্ম টার্গেট = x86 এর সাথে জরিমানা। এই মেশিনটিতে VS2012RC পাশাপাশি ইনস্টল করা আছে তাই 4.5 সম্ভবত কোনও স্থান-প্রতিস্থাপন করছে। যেকোন সিপিইউ এবং টার্গেটপ্ল্যাটফর্ম = 3.5 ব্যবহার করুন তবে এটি ক্রাশ হয় না তাই ফ্রেমওয়ার্কে কোনও রিগ্রেশনের মতো দেখাচ্ছে-
  • 4.0 এর সাথে ভিএস2010-এ x86, x64 বা যেকোন সিপিইউতে পুনরুত্পাদন করা যাবে না। - ফুজি
  • কেবল x64, (2012rc, Fx4.5) - হেনক হলটারম্যানের জন্য ঘটে
  • উইন 8 আরপিতে ভিএস2012 আরসি। .NET 4.5 লক্ষ্য করার সময় প্রাথমিকভাবে এই এমডিএটি দেখা হচ্ছে না। .NET 4.0 লক্ষ্য করে স্যুইচ করা হলে এমডিএ উপস্থিত হয়েছিল। তারপরে .NET 4.5 এ স্যুইচ করার পরে এমডিএ থেকে যায়। - ওয়েইন

আমি কখনই জানতাম না যে আপনি কোনও পাবলিকের সাথে স্ট্যাটিক কনস্ট্রাক্টরও তৈরি করতে পারবেন। হেক আমি কখনও জানতাম না স্থির নির্মাণকারীদের অস্তিত্ব রয়েছে।
কোল জনসন

আমার একটি ধারণা আছে: কারণ আপনি বি কিছুটা স্ট্যাটিক ক্লাস থেকে স্ট্যাটিক মেইন সহ কেবল একটি ক্লাসে পরিবর্তন করছেন?
কোল জনসন

@ ক্রিসসিনক্লেয়ার, আমি এটি মনে করি না। মানে আমি আমার ল্যাপটপে এই কোডটি পরীক্ষা করেছি এবং একই ফলাফল পেয়েছি।
গ্লেনো

@ কোল জনসন হ্যাঁ আইএল একটি স্পষ্ট জায়গা ছাড়া সব মিলছে। সি # সংকলকটিতে এখানে কোনও বাগ উপস্থিত হবে না।
মাইকেল গ্র্যাসেক

14
এটির প্রতিবেদন করার জন্য এখানে মূল পোস্টার এবং মাইকেলকে তার দুর্দান্ত বিশ্লেষণের জন্য উভয়কে ধন্যবাদ Thanks সিএলআর-এ আমার সহযোগীরা বাগটি এখানে পুনরুত্পাদন করার চেষ্টা করেছিল এবং আবিষ্কার করেছে যে এটি Release৪ বিট সিএলআর এর "রিলিজ প্রার্থী" সংস্করণে পুনরুত্পাদন করেছে, তবে চূড়ান্ত "রিলিজ টু ম্যানুফ্যাকচারিং" সংস্করণে নয়, এতে বেশ কয়েকটি বাগ ফিক্স রয়েছে - রেসিন। (আরটিএম সংস্করণটি ১৫ ই আগস্ট, ২০১২ এ জনসাধারণের জন্য উপলব্ধ হবে)) সুতরাং তারা বিশ্বাস করে যে এটিকে এখানে যেমন প্রতিবেদন করা হয়েছে তেমন সমস্যা হ'ল: সংযুক্ত.মাইক্রোসফট
এরিক লিপার্ট

উত্তর:


114

এটিও সম্পূর্ণ উত্তর নয়, তবে আমার কয়েকটি ধারণা রয়েছে।

আমি বিশ্বাস করি যে আমি। নেট জেআইটি টিমের উত্তর না দিয়ে কাউকে না পেয়ে যেমন ব্যাখ্যা পেয়েছি ততই ভাল পেয়েছি।

হালনাগাদ

আমি কিছুটা গভীর থেকে তাকালাম এবং আমি বিশ্বাস করি যে আমি সমস্যার উত্স খুঁজে পেয়েছি। এটি জেআইটি টাইপ-ইনিশিয়ালাইজেশন লজিকের মধ্যে একটি বাগের সংমিশ্রণ এবং সি # সংকলক পরিবর্তনের ফলে জেআইটি কাজ করে যে ধারণাটি নির্ভর করে তা নির্ভর করে বলে মনে হয়। আমি মনে করি জেআইটি বাগটি নেট নেট in.০ এ বিদ্যমান ছিল, কিন্তু .NET 4.5 এর জন্য সংকলক পরিবর্তনের মাধ্যমে তা উন্মোচিত হয়েছিল।

আমি beforefieldinitএখানে একমাত্র ইস্যু বলে মনে করি না । আমি মনে করি এটি এর চেয়ে সহজ।

টাইপ System.String.NET 4.0 থেকে mscorlib.dll একটি স্ট্যাটিক কন্সট্রাকটর রয়েছে:

.method private hidebysig specialname rtspecialname static 
    void  .cctor() cil managed
{
  // Code size       11 (0xb)
  .maxstack  8
  IL_0000:  ldstr      ""
  IL_0005:  stsfld     string System.String::Empty
  IL_000a:  ret
} // end of method String::.cctor

Mscorlib.dll .NET 4.5 সংস্করণে String.cctor(স্থির নির্মাতা ) সুস্পষ্টভাবে অনুপস্থিত:

..... কোনও স্থির নির্মাতা নেই :( .....

উভয় সংস্করণে Stringটাইপটি শোভিত হয় beforefieldinit:

.class public auto ansi serializable sealed beforefieldinit System.String

আমি একটি প্রকার তৈরির চেষ্টা করেছি যা একইভাবে আইএলকে সংকলিত করতে পারে (যাতে এটিতে স্ট্যাটিক ক্ষেত্র রয়েছে তবে কোনও স্ট্যাটিক নির্মাণকারী নেই .cctor), তবে আমি এটি করতে পারিনি। এই সমস্ত ধরণের .cctorআইএল-তে একটি পদ্ধতি রয়েছে:

public class MyString1 {
    public static MyString1 Empty = new MyString1();        
}

public class MyString2 {
    public static MyString2 Empty = new MyString2();

    static MyString2() {}   
}

public class MyString3 {
    public static MyString3 Empty;

    static MyString3() { Empty = new MyString3(); } 
}

আমার অনুমান যে নেট। 4.0 এবং 4.5 এর মধ্যে দুটি জিনিস পরিবর্তিত হয়েছে:

প্রথম: EE পরিবর্তন করা হয়েছিল যাতে এটি পরিচালনা করা String.Emptyকোড থেকে স্বয়ংক্রিয়ভাবে আরম্ভ হবে । এই পরিবর্তনটি সম্ভবত। নেট 4.0 এর জন্য করা হয়েছিল।

দ্বিতীয়: সংকলকটি পরিবর্তিত হয়েছে যাতে এটি স্ট্রিংয়ের জন্য কোনও স্ট্যাটিক নির্মাণকারী নির্গত করে না, জেনেও যে String.Emptyএটি পরিচালনা না করা দিক থেকে নির্ধারিত হবে। এই পরিবর্তনটি .NET 4.5 এর জন্য করা হয়েছে বলে মনে হয়।

এটি প্রদর্শিত হয় যে EE কয়েকটি অপ্টিমাইজেশন পাথের সাথে শীঘ্রই পর্যাপ্ত পরিমাণ বরাদ্দ দেয় নাString.Empty । সংকলকটিতে করা পরিবর্তন (বা String.cctorঅদৃশ্য হয়ে যা কিছু পরিবর্তিত হয়েছিল ) প্রত্যাশা করেছিল যে কোনও ব্যবহারকারী কোড কার্যকর করার আগে EE এই অ্যাসাইনমেন্টটি তৈরি করবে, তবে এটি প্রদর্শিত হয় যে String.Emptyরেফারেন্স টাইপ রিফাইড জেনেরিক ক্লাসের পদ্ধতিগুলিতে ব্যবহৃত হওয়ার আগে EE এই অ্যাসাইনমেন্টটি তৈরি করে না ।

সবশেষে, আমি বিশ্বাস করি যে জেআইটি টাইপ-ইনিশিয়ালাইজেশন যুক্তিটিতে বাগটি আরও গভীর সমস্যার সূচক। এটি প্রদর্শিত হয় যে সংকলকটির পরিবর্তনটি একটি বিশেষ ক্ষেত্রে System.String, তবে আমি সন্দেহ করি যে এখানে জেআইটি একটি বিশেষ মামলা করেছে System.String

মূল

প্রথমত, WOW ছাত্রলীগের লোকেরা কিছু পারফরম্যান্স অপটিমাইজেশন দিয়ে খুব সৃজনশীল অর্জন করেছে। অনেক এর Stringপদ্ধতি এখন একটি থ্রেড স্ট্যাটিক ক্যাশে ব্যবহার সঞ্চালিত হয় StringBuilderঅবজেক্ট।

আমি সেই সীসাটি কিছু সময়ের জন্য অনুসরণ করেছিলাম, তবে কোডের পথে StringBuilderব্যবহার করা হয়নি Trim, তাই আমি স্থির করেছি যে এটি কোনও থ্রেড স্ট্যাটিক সমস্যা হতে পারে না।

আমি মনে করি যদিও আমি একই বাগের একটি অদ্ভুত প্রকাশ পেয়েছি।

এই কোডটি অ্যাক্সেস লঙ্ঘনের সাথে ব্যর্থ হয়:

class A<T>
{
    static A() { }

    public A(out string s) {
        s = string.Empty;
    }
}

class B
{
    static void Main() { 
        string s;
        new A<object>(out s);
        //new A<int>(out s);
        System.Console.WriteLine(s.Length);
    }
}

যাইহোক, যদি আপনি অসুবিধা //new A<int>(out s);না করেন Mainতবে কোডটি ঠিক কাজ করে। আসলে, যদি Aকোনও রেফারেন্স টাইপ দিয়ে রিফাইড করা হয় তবে প্রোগ্রামটি ব্যর্থ হয়, তবে যদি Aকোনও মান প্রকারের সাথে সংশোধিত হয় তবে কোডটি ব্যর্থ হয় না। এছাড়াও যদি আপনি Aস্থিতিশীল নির্মাতাকে মন্তব্য করেন তবে কোডটি কখনও ব্যর্থ হয় না। Trimএবং Formatএটি খননের পরে , এটি স্পষ্ট যে সমস্যাটি হ'ল Lengthইনলাইন করা হচ্ছে, এবং এই Stringধরণের উপরে নমুনাগুলি শুরু করা হয়নি। বিশেষ করে, শরীরের ভিতরে Aএর কন্সট্রাকটর, string.Emptyসঠিকভাবে নির্ধারিত হয় না, যদিও শরীরের ভিতরে Main, string.Emptyসঠিকভাবে নির্ধারিত হয়।

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

এফওয়াইআই দুটি সংস্করণের জন্য এখানে জেআইটিড কোডটি রয়েছে:

A<object>.ctor(out string):

    public A(out string s) {
00000000  push        rbx 
00000001  sub         rsp,20h 
00000005  mov         rbx,rdx 
00000008  lea         rdx,[FFEE38D0h] 
0000000f  mov         rcx,qword ptr [rcx] 
00000012  call        000000005F7AB4A0 
            s = string.Empty;
00000017  mov         rdx,qword ptr [FFEE38D0h] 
0000001e  mov         rcx,rbx 
00000021  call        000000005F661180 
00000026  nop 
00000027  add         rsp,20h 
0000002b  pop         rbx 
0000002c  ret 
    }

A<int32>.ctor(out string):

    public A(out string s) {
00000000  sub         rsp,28h 
00000004  mov         rax,rdx 
            s = string.Empty;
00000007  mov         rdx,12353250h 
00000011  mov         rdx,qword ptr [rdx] 
00000014  mov         rcx,rax 
00000017  call        000000005F691160 
0000001c  nop 
0000001d  add         rsp,28h 
00000021  ret 
    }

বাকি কোডটি ( Mainদুটি) দুটি সংস্করণের মধ্যে অভিন্ন।

সম্পাদনা

উপরন্তু, দুটি সংস্করণ থেকে আইএল থেকে কল ছাড়া অভিন্ন A.ctorমধ্যে B.Main(), যেখানে প্রথম সংস্করণের জন্য আইএল রয়েছে:

newobj     instance void class A`1<object>::.ctor(string&)

বনাম

... A`1<int32>...

দ্বিতীয় মধ্যে।

আরেকটি বিষয় লক্ষণীয় A<int>.ctor(out string): এর জন্য জেআইটিড কোড : নন-জেনেরিক সংস্করণের মতো।


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

তাদের মধ্যে আইএল কি একই রকম?
কোল জনসন

49
ভাল বিশ্লেষণ! আমি এটি বিসিএল দলে পাস করব। ধন্যবাদ!
এরিক লিপার্ট

2
@ এরিকলিপার্ট এবং অন্যান্যরা: আমি আবিষ্কার করেছি যে জাতীয় কোড typeof(string).GetField("Empty").SetValue(null, "Hello world!"); Console.WriteLine(string.Empty);। নেট 4.0 বনাম। নেট 4.5 এ বিভিন্ন ফলাফল দেয়। এই পরিবর্তনটি কি উপরে বর্ণিত পরিবর্তনের সাথে সম্পর্কিত? নেট .৪.৪ কীভাবে প্রযুক্তিগতভাবে আমাকে ক্ষেত্রের মান পরিবর্তন করতে উপেক্ষা করতে পারে? আমি এই সম্পর্কে একটি নতুন প্রশ্ন জিজ্ঞাসা করা উচিত?
জেপ্পে স্টিগ নীলসন

4
@ জেপ্পস্টিগনিয়েলসন: আপনার প্রশ্নের উত্তরগুলি হ'ল: "সম্ভবত", "বেশ সহজেই, স্পষ্টতই", "এবং" এটি একটি প্রশ্নোত্তর সাইট, সুতরাং হ্যাঁ, আপনি যদি আপনার প্রশ্নের উত্তর আরও ভাল চান তবে এটি একটি ভাল ধারণা idea 'হতে পারে' "এর চেয়ে বেশি।
এরিক লিপার্ট

3

আমি দৃ 4.0়ভাবে সন্দেহ করি যে । নেট 4.0 এ এই অপ্টিমাইজেশনের কারণে (সম্পর্কিত BeforeFieldInit) এটি ঘটেছে।

যদি অামি যথাযথভাবে স্মরণ করি:

আপনি যখন স্ট্যাটিক কনস্ট্রাক্টরকে স্পষ্টভাবে ঘোষণা করেন তখন beforefieldinitনির্গত হয়, রানটাইমকে বলে যে কোনও স্ট্যাটিক সদস্য অ্যাক্সেসের আগে স্ট্যাটিক কনস্ট্রাক্টরটি চালানো উচিত

আমার ধারণা:

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

আমি আছে না আপনার কোড চালানো, তাই এই অংশ ভুল হতে পারে - কিন্তু যদি আমি অন্য অনুমান করা হয়েছিল, আমি বলতে চাই এটা কিছু হতে পারে string.Format(বা Console.WriteLineঅভ্যন্তরীণভাবে যে যেমন ক্র্যাশ ঘটাচ্ছে, যা অনুরূপ) অ্যাক্সেস করা প্রয়োজন সম্ভবত একটি স্থানীয় সম্পর্কিত সম্পর্কিত বর্গ যার স্পষ্ট স্ট্যাটিক নির্মাণ প্রয়োজন।

আবার, আমি এটি পরীক্ষা করিনি, তবে ডেটা সম্পর্কে এটি আমার সেরা অনুমান।

আমার অনুমানটি নির্দ্বিধায় পরীক্ষা করুন এবং আমাকে কীভাবে তা জানাতে দিন।


Bকোনও স্ট্যাটিক কনস্ট্রাক্টর না Aথাকা অবস্থায় ত্রুটিটি এখনও ঘটে এবং যখন কোনও মান ধরণের সাথে পুনরায় সংশোধন করা হয় তখন তা ঘটে না । আমি মনে করি এটি কিছুটা জটিল।
মাইকেল গ্র্যাসেক

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

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

আমি আরও আইএলটিতে নজর রেখেছি এবং আমি মনে করি আপনি কোনও কিছুর দিকে রয়েছেন। আমি মনে করি না যে দ্বিতীয় পাসের ধারণাটি এখানে প্রাসঙ্গিক হতে চলেছে, কারণ কোডটি এখনও ব্যর্থ হয় যদি আমি যথেচ্ছভাবে বহু কল করি A<object>.ctor()
মাইকেল গ্র্যাসেক

@ মিশেলগ্র্যাসিক: শুনতে ভাল লাগল, এবং সেই পরীক্ষার জন্য ধন্যবাদ। দুর্ভাগ্যক্রমে, আমি এটি আমার নিজের ল্যাপটপে পুনরুত্পাদন করতে পারি না। (২০১০.০ x x64) আপনি সত্যই স্ট্রিং-ফর্ম্যাটিংয়ের (যেমন লোকাল সম্পর্কিত) সম্পর্কিত কিনা তা পরীক্ষা করে দেখতে পারেন? আপনি যদি সেই অংশটি সরিয়ে দেন তবে কী হবে?
ব্যবহারকারী541686

1

একটি পর্যবেক্ষণ, তবে ডটপিক পচনশীল স্ট্রিংটি দেখায় mp

/// <summary>
/// Represents the empty string. This field is read-only.
/// </summary>
/// <filterpriority>1</filterpriority>
[__DynamicallyInvokable]
public static readonly string Empty;

internal sealed class __DynamicallyInvokableAttribute : Attribute
{
  [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
  public __DynamicallyInvokableAttribute()
  {
  }
}

যদি আমি Emptyগুণটি বাদ দিয়ে নিজের মত একইভাবে ঘোষণা করি তবে আমি আর এমডিএ পাব না:

class A<T>
{
    static readonly string Empty;

    static A() { }

    public A()
    {
        string.Format("{0}", Empty);
    }
}

আর সঙ্গে যে অ্যাট্রিবিউট? আমরা ইতিমধ্যে ""এটি সমাধান করে প্রতিষ্ঠিত ।
হেন্ক হলটারম্যান

এই "পারফরম্যান্স সমালোচনা ..." অ্যাট্রিবিউটটি অ্যাট্রিবিউট কনস্ট্রাক্টরকেই প্রভাবিত করে, বৈশিষ্ট্যগুলি যে পদ্ধতিগুলি শোভিত করে তা নয়।
মাইকেল গ্র্যাসেক

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