আমি কী সি # অবিচ্ছেদ্য উল্লেখগুলি বলতে পারি যে কোনও পদ্ধতি কার্যকরভাবে ক্ষেত্রের নাল চেক


14

নিম্নলিখিত কোড বিবেচনা করুন:

#nullable enable
class Foo
{
    public string? Name { get; set; }
    public bool HasName => Name != null;
    public void NameToUpperCase()
    {
        if (HasName)
        {
            Name = Name.ToUpper();
        }
    }
}

নাম = নাম.আমাদের উপর () আমি একটি সতর্কতা পেয়েছি যে নামটি একটি সম্ভাব্য নাল রেফারেন্স, যা পরিষ্কারভাবে ভুল। আমি এই সতর্কতাটি HasName ইনলাইন করে নিরাময় করতে পারি তাই শর্ত যদি (নাম! = নাল) থাকে।

আমি কি কোনও উপায়ে সংকলককে নির্দেশ দিতে পারি যে হাসনামের সত্যিকারের প্রতিক্রিয়া নামের উপর একটি অ-অযোগ্যতা বাধা বোঝায়?

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


1
আইএমও আপনার HasValueএকটি ক্ষুদ্র প্রকারে ব্যবহার করা উচিত , এটির বিরুদ্ধে পরীক্ষা না করে null। যদিও এটি সম্ভবত আপনার সমস্যার প্রভাব ফেলবে না।
— ফ্রেডরিক

আমি মনে করি আপনার ক্ষেত্রে কেস, আপনি #nullable disableতারপরে #nullable enableবা তারপরে restoreআবার কোডটি মোড়ানো করতে পারেন ( ডকস.মাইক্রোসফটকম / en-us / dotnet / csharp/… )।
— গ্যারিএনজি

5
আপনি "ড্যামিমেট" !অপারেটরটি ব্যবহার করতে পারেন । if(HasName) { Name = Name!.ToUpper(); }
— জান পাওলো গো

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

উত্তর:


3

আমি চারপাশে বিভিন্ন গুণাবলী System.Diagnostics.CodeAnalysisদেখেছি এবং আমি কার্যকর কিছু খুঁজে পেলাম না যা হতাশাব্যঞ্জক। আপনি যা চান তার নিকটতম আপনি এটি দেখতে পেতে পারেন:

public bool TryGetName([NotNullWhen(true)] out string? name)
{
    name = Name;
    return name != null;
}

public void NameToUpperCase()
{
    if (TryGetName(out var name))
    {
        Name = name.ToUpper();
    }
}

এটা দেখতে বেশ কষ্টকর মনে হচ্ছে, আমি জানি। আপনি অযোগ্য বৈশিষ্ট্যের জন্য এমএসডিএন ডক্সটি দেখতে পারেন , সম্ভবত আপনি আরও সুন্দর কিছু খুঁজে পাবেন।


2
দেখে মনে হচ্ছে আমাদের আরও বৈশিষ্ট্য বা
— টাইপস্ক্রিপ্টের

আমি এটিকে উত্তর হিসাবে বেছে নেব, কারণ দেখা যাচ্ছে যে আসল উত্তরটি, যেহেতু আমি ভীত ছিলাম তা হ'ল "না, সি # এখনও তা করে না।"
— জন মেলভিলে

@ জনমেলভিলে আমি এই জাতীয় বৈশিষ্ট্যের জন্য কোনও প্রস্তাব খুঁজে পাইনি, তাই আমি মনে করি না যে আমরা খুব শীঘ্রই এই পরিবর্তনের আশা করতে পারি।
— V0ldek

2
@ এক্সআইইউ সংকলক ইতিমধ্যে এই দিক থেকে লম্বা। যদি আপনি if(Name != null) return Null.ToUpper()এটি করেন তবে নালাগুলির জন্য কোনও সতর্কতা থাকবে না , যদিও প্রযুক্তিগতভাবে এটি একটি স্পর্শী দৌড়ের অবস্থা। আমার মনে আছে ম্যাডস টর্গারেন তারা কীভাবে বিবেচনা করেছিলেন সে সম্পর্কে কথা বলছিলেন, তবে এটি এতগুলি মিথ্যা ইতিবাচক উত্স তৈরি করবে যা সম্পূর্ণ অযোগ্য রেফারেন্স ধরণের বৈশিষ্ট্যটি কার্যকরভাবে অকেজো হয়ে যাবে - 99% সময় আপনার সম্পত্তি অন্য থ্রেড দ্বারা পরিবর্তিত হবে না। সুতরাং আপনাকে যা করতে হবে তা হ'ল একটি বৈশিষ্ট্য তৈরি করা যা এই সম্পত্তিটির চেকটি অন্য সম্পত্তির নালার জন্য চেক হিসাবে বিবেচনা করবে।
— V0ldek

2
আমি "এইটির জন্য কোনও প্রস্তাব খুঁজে পাচ্ছি না" সমস্যার সমাধান করেছি। ( github.com/dotnet/csharplang/issues/2997 ) আমার ভাগ্য কামনা করুন।
— জন মেলভিল

-10

স্ট্রিং হল একটি রেফারেন্স টাইপ, এবং nullable (উদাঃ int?) হ'ল মূল্য মূল্য। সুতরাং আপনি সত্যিই এটি করতে পারবেন না string? myString; আপনার যা প্রয়োজন তা হ'ল:

class Foo
{
    public string Name { get; set; }
    public bool HasName => !String.IsNullOrEmpty(Name);  ////assume you want empty to be treated same way as null
    public void NameToUpperCase()
    {
        if (HasName)
        {
            Name = Name.ToUpper();
        }
    }
}

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