সি # /। নেটগুলিতে পরামিতিগুলি আবশ্যক নয় হিসাবে চিহ্নিত করুন?


99

এমন কোনও সাধারণ বৈশিষ্ট্য বা ডেটা চুক্তি রয়েছে যা আমি কোনও ফাংশন প্যারামিটারে নির্ধারণ করতে পারি যা nullসি # /। নেট পাস হতে বাধা দেয় ? মূলত এই কম্পাইল সময়ে পরীক্ষা নিশ্চিত আক্ষরিক করবার জন্য প্রস্তুতি নিচ্ছে nullতার জন্য এবং রান টাইম থ্রো এ ব্যবহৃত হচ্ছে না যে কোন জায়গায় ArgumentNullException

বর্তমানে আমি কিছু লিখি ...

if (null == arg)
  throw new ArgumentNullException("arg");

... প্রতিটি যুক্তি যা আমি আশা করি না null

একই নোটে, এর বিপরীতে কি এর Nullable<>দ্বারা নিম্নলিখিতগুলি ব্যর্থ হবে:

NonNullable<string> s = null; // throw some kind of exception

7
সি # এর সাম্প্রতিক সংস্করণগুলির সাথে, "নেমফ ()" ব্যবহার করে আরও ভাল কাজ হয়: নতুন আর্গুমেন্টনুল এক্সসেপশন (নেমোফ (আরজি)) নিক্ষেপ করুন; এইভাবে, আপনি যদি নামটি
পুনরুদ্ধার করেন

সি # 8 এখন অযোগ্য রেফারেন্স টাইপগুলিকে সমর্থন করে যা একটি সংকলক বিকল্প যা আপনি আপনার প্রকল্পে চালু করতে পারেন। ডকস.মাইক্রোসফট.ইন- ইউএস
পল স্টিগলার

উত্তর:


69

দুর্ভাগ্যক্রমে, সংকলন-সময় উপলভ্য কিছুই নেই।

আমার কিছুটা হ্যাকি সমাধান রয়েছে যা আমি সম্প্রতি আমার ব্লগে পোস্ট করেছি, যা একটি নতুন স্ট্রাক্ট এবং রূপান্তর ব্যবহার করে।

কোড কনট্রাক্টস স্টাফ সহ .NET 4.0 এ , জীবন অনেক সুন্দর হবে। এটি বাস্তব-ভাষা বাক্য গঠন এবং অ-অযোগ্যতার আশেপাশে সমর্থন করলেও বেশ সুন্দর লাগবে তবে কোড চুক্তিগুলি অনেক সাহায্য করবে।

থ্রোআইফনুল নামক মিসকুটিলে আমার একটি এক্সটেনশন পদ্ধতি রয়েছে যা এটিকে কিছুটা সহজ করে তোলে।

একটি চূড়ান্ত বিষয় - " if (null == arg)" এর পরিবর্তে " " ব্যবহারের কোনও কারণ if (arg == null)? আমি উত্তরোত্তর পড়তে আরও সহজ, এবং সি সমস্যা সমাধান করে প্রাক্তনটি সি # তে প্রযোজ্য না।


4
> সংকলন সময়ে দুর্ভাগ্যক্রমে কিছুই উপলভ্য নেই। > ...> আমি সম্মত নন-অযোগ্যতার আশেপাশে প্রকৃত ভাষার বাক্য গঠন এবং সমর্থনটি পাওয়া খুব সুন্দর হবে। সংকলন-সময় ত্রুটিগুলি উত্থাপিত দেখতেও চাই।
অ্যান্ড্রুজ্যাকসনজেডে 2:25

4
@ জন, "যদি (আরগ = নাল)" বুল সংজ্ঞায়িত করার জন্য অন্তর্নিহিত অভিনেতার হয়ে থাকে তবে কাজ করে না? আমি স্বীকার করি এটি বিকৃত মনে হতে পারে তবে এটি সংকলন করে ...
টমাস এস ট্রায়াস

11
@ থমাস এস। ট্রায়াস: হ্যাঁ, সেই অবিশ্বাস্যভাবে অস্পষ্ট প্রান্তের ক্ষেত্রে, টাইপ হওয়ার সাথে মিলিয়ে , সেই কোডটির চারপাশে পরীক্ষার অভাবের সংগে, আপনি একটি সমস্যার সমাধান করবেন। এই মুহুর্তে আমার মনে হয় আপনার আরও বড় সমস্যা রয়েছে তবে :)
জন স্কিটি

4
@ জন: মঞ্জুর। আমার ধারণা আমি আমার প্রিয় যোদা শর্তগুলি ছেড়ে দেব। :-)
থমাস এস ট্রায়াস

4
@ সেবাস্তিয়ানম্যাচ: আমি বিশ্বাস করি না if (null == x)যদিও এর কারণটি প্রাকৃতিক ভাষার পার্থক্যের কারণে। আমি বিশ্বাস করি এটি সত্যিই একটি অপ্রচলিত শৈলীর সম্পর্কে যা কেবল উদাহরণ ইত্যাদির মাধ্যমে প্রচার করে
জোন স্কিট

23

আমি জানি আমি এই প্রশ্নে অবিশ্বাস্যভাবে দেরি করেছি, তবে আমি মনে করি উত্তরটি প্রাসঙ্গিক হয়ে উঠবে কারণ সি # এর সর্বশেষ প্রধান পুনরাবৃত্তি প্রকাশের কাছাকাছি আসে, পরে প্রকাশিত হয়। সি # 8.0 এ একটি বড় পরিবর্তন আসবে, সি # সমস্ত ধরণের নਾਲ নয় বলে ধরে নেওয়া হবে

ম্যাডস টর্গারসেনের মতে:

সমস্যাটি হল নাল উল্লেখগুলি এত কার্যকর। সি # তে, তারা প্রতিটি রেফারেন্স টাইপের ডিফল্ট মান। ডিফল্ট মান আর কি হবে? কোনও ভেরিয়েবলের আর কী মান থাকতে পারে, যতক্ষণ না আপনি সিদ্ধান্ত নিতে পারেন যে এটিকে আর কী বরাদ্দ করা হবে? যত তাড়াতাড়ি আপনি এটি পূরণ করার আশেপাশে না পৌঁছাবেন ততক্ষণে আমরা আর কী কী মান সহ নতুন করে বরাদ্দকৃত রেফারেন্সগুলি দিয়ে রইলাম?

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

সুতরাং ম্যাডস দ্বারা প্রদত্ত রেজোলিউশনটি হ'ল:

  1. আমরা বিশ্বাস করি যে রেফারেন্সটি নালাগুলি না চাওয়াই বেশি সাধারণ। অযোগ্য রেফারেন্স ধরণেরগুলি বিরল ধরনের হবে (যদিও আমাদের কতটা বলতে আমাদের কাছে ভাল ডেটা নেই) তবে এগুলি হ'ল একটি নতুন টিকা প্রয়োজন।

  2. ভাষাটি ইতিমধ্যে - নল মান ধরণের জন্য - এবং একটি সিনট্যাক্সের ধারণা রয়েছে not দুজনের মধ্যে সাদৃশ্য ভাষা সংযোজনকে ধারণাগতভাবে সহজ এবং ভাষাতাত্ত্বিকভাবে সহজ করে তুলবে।

  3. এটি সঠিক বলে মনে হচ্ছে আপনি নিজেরাই বা আপনার গ্রাহককে বোঝার নাল মান দিয়ে বোঝা করবেন না যদি আপনি সক্রিয়ভাবে সিদ্ধান্ত না নেন যে আপনি সেগুলি চান। নালস, তাদের অনুপস্থিতি নয়, এমন জিনিস হওয়া উচিত যা আপনাকে স্পষ্টভাবে বেছে নিতে হবে।

পছন্দসই বৈশিষ্ট্যের একটি উদাহরণ:

public class Person
{
     public string Name { get; set; } // Not Null
     public string? Address { get; set; } // May be Null
}

পূর্বরূপটি ভিজ্যুয়াল স্টুডিও 2017, 15.5.4+ পূর্বরূপের জন্য উপলব্ধ।


4
কেউ কি জানেন যে এটি কখনও সি # 8.0 এর অংশ হয়ে গেছে?
ট্রয়স্টেভেন

@ ট্রয়স্টেভেন হ্যাঁ এটি হ'ল, ভিজুয়াল স্টুডিওতে সেটিংসের মাধ্যমে আপনাকে এটি বেছে নিতে হবে।
গ্রেগ

@ ট্রয়স্টেভেন এখানে এটির ডকুমেন্টেশন রয়েছে। ডকস.মাইক্রোসফট.ইন- ইউএস
গ্রেগ

দুর্দান্ত, সুতরাং দেখে মনে হচ্ছে এটি কাজ করা শুরু করার আগে আপনাকে এটি সক্ষম করতে হবে, এটি পিছনের সামঞ্জস্যের জন্য দুর্দান্ত।
ট্রয়স্টেভেন

15

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে এটি এখানে নিখোঁজ ছিল:

আপনি যদি রিশ্যার্পার / রাইডার ব্যবহার করেন তবে আপনি এনোটেটেড ফ্রেমওয়ার্কটি ব্যবহার করতে পারেন ।

সম্পাদনা করুন : আমি এই উত্তরটির জন্য মাত্র একটি এলোমেলো -1 পেয়েছি। সেটা ঠিক আছে. এটি সচেতন হোন এটি এখনও বৈধ, যদিও এটি সি # 8.0 + প্রকল্পের জন্য প্রস্তাবিত পদ্ধতি নয় (কেন বোঝার জন্য, গ্রেগের উত্তর দেখুন )।


4
মজার ব্যাপার হচ্ছে, যে ডিফল্টরূপে আপনার কম্পাইল আবেদন JetBrains.Annotations.dll রেফারেন্স থাকবে না তাই আপনি করতে হবে না আবেদন সঙ্গে এটি বিতরণ করা: JetBrains টীকা কীভাবে ব্যবহার করতে হয় ReSharper পরিদর্শন উন্নত করতে
Lu55

9

এন্টারপ্রাইজ লাইব্রেরিতে ভ্যালিডিটারগুলি দেখুন। আপনি যেমন কিছু করতে পারেন:

private MyType _someVariable = TenantType.None;
[NotNullValidator(MessageTemplate = "Some Variable can not be empty")]
public MyType SomeVariable {
    get {
        return _someVariable;
    }
    set {
        _someVariable = value;
    }
}

তারপরে আপনার কোডটিতে যখন আপনি এটি যাচাই করতে চান:

Microsoft.Practices.EnterpriseLibrary.Validation.Validator myValidator = ValidationFactory.CreateValidator<MyClass>();

ValidationResults vrInfo = InternalValidator.Validate(myObject);

0

সবচেয়ে সুন্দর নয়:

public static bool ContainsNullParameters(object[] methodParams)
{
     return (from o in methodParams where o == null).Count() > 0;
}

আপনি কনটেনস নলপ্যারামিটার পদ্ধতিতেও আরও সৃজনশীল পেতে পারেন:

public static bool ContainsNullParameters(Dictionary<string, object> methodParams, out ArgumentNullException containsNullParameters)
       {
            var nullParams = from o in methodParams
                             where o.Value == null
                             select o;

            bool paramsNull = nullParams.Count() > 0;


            if (paramsNull)
            {
                StringBuilder sb = new StringBuilder();
                foreach (var param in nullParams)
                    sb.Append(param.Key + " is null. ");

                containsNullParameters = new ArgumentNullException(sb.ToString());
            }
            else
                containsNullParameters = null;

            return paramsNull;
        }

অবশ্যই আপনি একটি বিরতি বা প্রতিবিম্ব ব্যবহার করতে পারেন তবে এগুলি সামান্য ওভারহেড সহ অনুসরণ / ব্যবহার করা সহজ


4
এই জাতীয় কোয়েরি ব্যবহার করে খুব খারাপ অনুশীলন: return (from o in methodParams where o == null).Count() > 0; ব্যবহার করুন: return methodParams.Any(o=>o==null);এটি বড় সংগ্রহগুলিতে আরও দ্রুত হবে
যবনोस्তা

কেন ব্যতিক্রম পাস? কেন শুধু ফেলে দিই না?
মার্টিন ক্যাপোডিসি

-4

ঠিক আছে এই উত্তরটি কিছুটা দেরিতে হয়েছে, তবে আমি এখানে এটি কীভাবে সমাধান করছি:

public static string Default(this string x)
{
    return x ?? "";
}

এই এক্সেনশন পদ্ধতিটি ব্যবহার করুন তারপরে আপনি নাল এবং ফাঁকা স্ট্রিংটিকে একই জিনিস হিসাবে বিবেচনা করতে পারেন।

যেমন

if (model.Day.Default() == "")
{
    //.. Do something to handle no Day ..
}

আদর্শ নয় আমি জানি যেহেতু আপনাকে সর্বত্র ডিফল্ট কল করতে হবে তবে এটি একটি সমাধান।


4
এটি (x == নাল) চেকগুলির চেয়ে আরও ভাল / কীভাবে সহজ? বা স্ট্রিং.আইএসনোটনুলআরএম্পটি ফাংশন।
বাতাভিয়া

string.IsNotNullOrEmptyআপনার বাম দিকে যে জিনিসটি যত্নশীল তা করা চিনির চেয়ে সত্যই অন্য কিছু নয় । অন্যান্য ফাংশন (দৈর্ঘ্য, সংক্ষিপ্তকরণ) ইত্যাদি খাওয়ানো যেতে পারে ইত্যাদি প্রান্তিকভাবে আরও ভাল।
মার্টিন ক্যাপোডিসি

@ মার্টিনক্যাপোডিসি এছাড়াও, এটি একটি মায়া তৈরি করে যে আপনি নাল ( ) এ ইনস্ট্যান্স পদ্ধতি ( Default()) কল করতে নিরাপদ । আমি জানি বর্ধনের পদ্ধতিগুলি শূন্যের বিরুদ্ধে পরীক্ষা করা হয় না, তবে আমার চোখ সচেতন নয় এবং তারা ইতিমধ্যে কোডটিতে কল্পনা করেছিল : :)model.Day?model?.Day?.Default()
অ্যালব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.