সি # 8-এ কোনও অ-অযোগ্য রেফারেন্স টাইপ রানটাইমে নাল হতে পারে?


10

আমার কাছে মনে হয় সত্যিকার অর্থে কোনও গ্যারান্টি নেই যে কোনও অ-পরিবর্তনযোগ্য ভেরিয়েবলের নাল হবে না। কল্পনা করুন আমার একটি শ্রেণি রয়েছে যার একটি সম্পত্তি রয়েছে যা অযোগ্য নয়:

public class Foo
{
    public Foo(string test)
    {
        Test = test;
    }
    public string Test {get;set;}
}

এখন মনে হতে পারে এটি এখন নালার হতে পারে না। তবে আমরা যদি এই ক্লাসটি অন্য কোনও লাইব্রেরির সাথে উল্লেখ করি যা অযোগ্য প্রসঙ্গটি ব্যবহার করে না, কিছুই সেখানে নাল পাঠানো থেকে বিরত রাখে।

এটি কি সঠিক বা কিছু রানটাইম চেক পাশাপাশি রয়েছে যা এটি নিশ্চিত করে?


এটা public void Foo(string test){...}নাকি public Foo(string test){...}?
huMpty duMpty

ধন্যবাদ, আমি এটি স্থির করেছি। কনস্ট্রাক্টর তৈরির জন্য মানুষ যখন আর # তে খুব বেশি ভরসা করে তখন ঘটেছিল :)
ইলিয়া চেরনমর্ডিক


সংক্ষেপে, "nullaable রেফারেন্স ধরণের" বৈশিষ্ট্যটি সম্পূর্ণরূপে ভাঙা।
আলেজান্দ্রো

উত্তর:


9

এমএস এই কথাটি বলেছে ( https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/upgrade-to-nullable-references#interfaces-with-ternternal-code ):

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


2

কেউ সর্বদা করতে পারেন

var myFoo = new Foo(null);

আপনি ডোমেন চালিত ডিজাইন ব্যবহার করতে পারেন

public class Foo
{
    public Foo(string test)
    {
         if (string.IsNullOrWhiteSpace(test))
             throw new ArgumentNullException(nameof(test));

         Test = test;
    }
    public string Test {get;private set;}
}

হ্যাঁ, আপনি ঠিক বলেছেন, যাইহোক আমার ধারণা এটি কেবল একটি সতর্কতা। আমি আশা করি ভবিষ্যতে তারা এটিকে বাস্তবায়িত করতে পারে যেমন কোটলিন
ইলিয়া চেরনমর্ডিক

2

আপনি সঠিক, অন্য কোড যা নতুন বৈশিষ্ট্যটি ব্যবহার করছে না এই সম্পত্তিটিকে নালার জন্য নির্ধারণ করতে পারে, কোনও রান-টাইম চেক নেই এটি কেবল কমপ্লায়ার ইঙ্গিত।

আপনি রানটাইম চেক চাইলে আপনি সর্বদা এটি নিজেই করতে পারেন:

public string Test { get; set{ if (value == null) throw new ArgumentNullException() } }

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

অবশ্যই লোকেরা আপনার কোড আপ করতে * *** প্রতিচ্ছবি ব্যবহার করতে পারে তবে এটি তাদের উপর রয়েছে


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

ভাল .... আপনি যে কোডটি সংকলন করতে পারবেন না, আপনি তাতে ইঙ্গিতগুলি রাখতে পারেন ... তবে অন্যান্য লোকের কোডগুলিতে ইঙ্গিত নেই তবে আপনার কোডটি উল্লেখ করে - হ্যাঁ তারা একটি নাল ব্যতিক্রম পেতে পারে
মিলেনি

ঠিক আছে, উদাহরণস্বরূপ, যদি কোনও স্বয়ংচালক আপনার কনস্ট্রাক্টর ব্যবহার করে বা এর মতো কিছু করে, তবে এটি এখনও আপনিই ব্যতিক্রম পাবেন :)
ইলিয়া চেরনমর্ডিক

Of course people can still use reflection to f*** your code up, সত্য, সত্য। এটি করার জন্য আপনি অবশ্যই প্রতিবিম্বটি ব্যবহার করতে পারেন, এটি কি প্রস্তাবিত , না , লোকেরা এখনও এটি করে, হ্যাঁ।
ěŕxěŕ

2

এমনকি আপনার নিজের কোডেও যদি আপনি এটি করতে পছন্দ করেন nullতবে নাল-ক্ষমাকারী অপারেটরটি ব্যবহার করে আপনি পাস করতে পারবেন । null!সংকলকের নালিয়াযোগ্যতা বিশ্লেষণ সম্পর্কিত যতটা দূরে নাল হিসাবে বিবেচিত হয়।


-1

নাল চেকগুলি মোকাবেলা করতে এবং আপনার কোডটিকে পঠনযোগ্য করে তোলার জন্য, আমি নাল অবজেক্ট ডিজাইন প্যাটার্নের পরামর্শ দিই।

এখানে আরও পড়া:

https://www.c-sharpcorner.com/article/null-object-design-pattern/

মূলত, এটিতে একটি নতুন অবজেক্ট তৈরি করা জড়িত যা একই ইন্টারফেস থেকে উদ্ভূত এবং নাল উদাহরণ রয়েছে।

উদাহরণ:

public class NullExample : IExample  
{  
    private static NullExample _instance;  
    private NullExample()  
    { }  

    public static NullExample Instance  
    {  
        get {  
            if (_instance == null)  
                return new NullExample();  
            return _instance;  
        }  
    }  

    //do nothing methods  
    public void MethodImplementedByInterface1()  
    { }  

    public void MethodImplementedByInterface1()  
    { }  
}  

নলগুলি এড়ানো যায় না, তবে সেগুলি পরিষ্কারভাবে পরীক্ষা করা যায়।

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