কি? []? সি # তে সিনট্যাক্স?


85

যদিও আমি অধ্যয়নরত ছিল প্রতিনিধি যা হয় আসলে একটি বিমূর্ত বর্গ Delegate.csদেখলাম নিম্নলিখিত পদ্ধতি যা আমি বুঝতে পারছি না

  • ?এটি ইতিমধ্যে একটি রেফারেন্স ( শ্রেণি ) ধরণের হলেও ফেরতের মানটি কেন ব্যবহার করে
  • ?[]? পরামিতি মানে

আপনি ব্যাখ্যা করতে পারেন?

public static Delegate? Combine(params Delegate?[]? delegates)
{
    if (delegates == null || delegates.Length == 0)
        return null;

    Delegate? d = delegates[0];
    for (int i = 1; i < delegates.Length; i++)
        d = Combine(d, delegates[i]);

    return d;
}


23
এটি কী নালার অ্যারে নয় যা নলযোগ্য মানগুলি ধারণ করে?
সিড

3
সি # 8, আপনি এখন নির্দিষ্ট করতে পারেন যে কোনও অবজেক্ট ভেরিয়েবলটি নালায় থাকার অনুমতি নেই। আপনি যে কম্পাইলার পতাকা টুসকি, তাহলে আপনি যে পরিবর্তনশীল যে নির্দিষ্ট করতে হবে হয় শূন্য থাকার জন্য অনুমোদিত।
জেরেমি লেকম্যান

উত্তর:


66

ধাপে ধাপে ব্যাখ্যা:

params Delegate?[] delegates - এটি নালার একটি অ্যারে Delegate

params Delegate?[]? delegates - পুরো অ্যারেটি শুল্কযুক্ত হতে পারে

যেহেতু প্রতিটি প্যারামিটারটি টাইপের হয় Delegate?এবং আপনি Delegate?[]?অ্যারের সূচকটি ফেরত দেন , তারপরে এটি বোঝা যায় যে রিটার্নের Delegate?ধরণটি অন্যথায় কম্পাইলার একটি ত্রুটি ফিরে আসবে যেমন আপনি পুনরুদ্ধার করছেন এবং intকোনও পদ্ধতিতে যে স্ট্রিংটি ফিরে আসে।

উদাহরণস্বরূপ আপনার কোডটি Delegateএই জাতীয় ধরণের ফিরে আসতে পারে :

public static Delegate Combine(params Delegate?[]? delegates)
{
    Delegate defaulDelegate = // someDelegate here
    if (delegates == null || delegates.Length == 0)
        return defaulDelegate;

    Delegate d = delegates[0] ?? defaulDelegate;
    for (int i = 1; i < delegates.Length; i++)
        d = Combine(d, delegates[i]);

    return d;
}

4
আমার প্রথম প্রশ্ন সম্পর্কে কি? রিটার্নের মানটি ?ইতিমধ্যে রেফারেন্স (শ্রেণি) প্রকারের হলেও কেন ব্যবহার করে
স্নার - মনিকা পুনরায়

2
কারণ আপনি ফিরে আসছেন যে প্রতিনিধি? টাইপ করুন। এবং পরামিতিগুলির উপর নির্ভর করে নাল বা প্রতিনিধিও
এথানসিয়োস কাতারস

2
@ এসএনআর রিটার্ন মানটি ?একই কারণে যুক্তি মানটি কেন ব্যবহার করে তা ব্যবহার করে ?। যদি আপনি পরবর্তীটি বুঝতে পারেন তবে আপনি স্বয়ংক্রিয়ভাবে পূর্বটিকে বুঝতে পারবেন। কারণ পদ্ধতিটি নাল ফিরে আসতে পারে , প্যারামিটারের মতো নালাকে গ্রহণ করতে পারে । অর্থাৎ, উভয়ই নাল থাকতে পারে
জিসার্গ

2
আমি এটি ছোঁয়া। আমি উদাহরণ দিয়ে দ্বিতীয় অংশ হিসাবে এটি উত্তর দিয়েছি। Since each parameter is of the type Delegate? and you return an index of the Delegate?[]? array, then it makes sense that the return type is Delegate?
অ্যাথানাসিওস কাতারস

2
@ এসএনআর: রিটার্নের মানটি কেন ব্যবহার করে? যদিও এটি ইতিমধ্যে রেফারেন্স (শ্রেণি) প্রকার (1) স্ট্রাক্ট একই ধরণের কোডে ব্যবহৃত হয় তবে এটি একটি অভ্যাস বা রিফ্যাক্টরিং অবশেষ থাকতে পারে (2) সি # 8 এ রেফারেন্স টাইপগুলি সহজাতভাবে নলাবদ্ধ হতে পারে না (সুতরাং সুস্পষ্ট নূন্যতার প্রয়োজন হয়) 3) Foo?একটি ঝরঝরে HasValueসম্পত্তি আছে, সেখানে যাচাই করা Fooপ্রয়োজন == null(4) এটি এমন বিকাশকারীদের সাথে যোগাযোগ করে যে পদ্ধতিটি স্বাক্ষরটি পড়ে যে নালগুলি সম্ভাব্য, প্রত্যাশিত হওয়া এবং সঠিক ফলাফল হতে পারে ((5) কোডটি এমন কেউ লিখেছেন বলে মনে হচ্ছে অযোগ্যতা এবং এটি সম্পর্কে সুস্পষ্ট হওয়া খুব পছন্দ very
ফ্ল্যাটার

25

অযোগ্য রেফারেন্স প্রকারগুলি সি # 8.0 এ নতুন, সেগুলি এর আগে বিদ্যমান নেই।

এটি ডকুমেন্টেশনের বিষয়, এবং সংকলন সময়ে কীভাবে সতর্কতা উত্পন্ন করা হয়।

ব্যতিক্রমটি "অবজেক্টের কোনও উপকরণের জন্য সেট করা নেই" ব্যতিক্রমটি শান্ত সাধারণ। তবে এটি একটি রানটাইম ব্যতিক্রম, এটি ইতিমধ্যে সংকলন সময়ে আংশিকভাবে আবিষ্কার করতে পারে।

একটি নিয়ন্ত্রকের জন্য Delegate dআপনি সর্বদা কল করতে পারেন

 d.Invoke();

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

একটি নতুন Delegate? pএই কোড জন্য যখন

 p.Invoke();

একটি সংকলক সতর্কতা উত্পাদন করবে। CS8602: Dereference of a possibly null reference আপনি না লিখলে:

 p?.Invoke();

এর অর্থ, নাল না হলে কেবল কল করুন।

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


যে সতর্কতার সাথে আপনি নিশ্চিতভাবে জানেন Delegateনা যে এটি নাল নয় with আপনি কেবল ভান করেছেন যে আপনি নিশ্চিতভাবে জানেন (যা বেশিরভাগ ক্ষেত্রে যথেষ্ট ভাল)।
টিম পোহলমান

@ টিমপোহলম্যান পাশাপাশি ইন্ট আই = নালও অসম্ভব, একটি স্ট্রিং এস = নালও অসম্ভব (এই ব্রেকিং পরিবর্তনের সাথে সি # 8 এ)। সুতরাং এটি কিছু ভান করার চেয়ে কিছুটা বেশি। পশ্চাদপদ সামঞ্জস্যের জন্য এটি একটি সতর্কতার সাথে ডাউনগ্রেড হয়েছে। যদি আপনি সতর্কতাটিকে কোনও ত্রুটিতে আপগ্রেড করেন তবে আপনি নিশ্চিতভাবেই জানেন যে এটি বাতিল নয়।
হোলগার

4
গতবার আমি পরীক্ষা করেছিলাম এনআরটিগুলি 100% বুলেট প্রুফ নয়। কয়েকটি প্রান্তের কেস রয়েছে যা সংকলক সনাক্ত করতে পারে না।
টিম পোহলমান

হ্যাঁ, তবে এটি "ভেরিয়েবল ইনিশিয়েটেড নয়" বা "সমস্ত কোড পাথ একটি মান ফেরায় না" হিসাবে সতর্কতা হিসাবে সমান। এগুলি রানটাইম সনাক্তকরণ ছাড়াই সমস্ত 100% সংকলন-সময় বৈশিষ্ট্য। ইন্টের মতো নয়?, আমার কাছে মনে হয় তারা অতিরিক্ত তথ্য রাখার জন্য অতিরিক্ত মেমরি যোগ করে না। সুতরাং আসুন আমরা এটি ইন্টেলিজেন্সের মতো নির্ভরযোগ্য। বেশ ভাল.
হোলার

1
আপনার যদি intএটি থাকে তবে তা কখনই শূন্য হতে পারে না। আপনার যদি Delegateএটি থাকে তবে এটি নাল হতে পারে (বিভিন্ন কারণে, যেমন প্রতিবিম্ব)। এটি ধরে নেওয়া সাধারণত নিরাপদ যে Delegate(সি # 8 এ এনআরটি সক্ষম করে) নিখর নয়, তবে আপনি কখনই নিশ্চিতভাবে জানতে পারবেন না ( intআমরা কোথায় জানি এটি নিশ্চিতভাবে জানি)।
টিম পোহলমান

5

সি # 8 এ একটি স্পষ্টরূপে রেফারেন্সের ধরণগুলি শোধনযোগ্য হিসাবে চিহ্নিত করতে হবে।

ডিফল্টরূপে, এই ধরণের মানগুলি প্রকারের মতো নাল, কিন্ডা রাখতে সক্ষম হয় না। জিনিসগুলি কীভাবে হুডের নীচে কাজ করে তা পরিবর্তিত হয় না, তবে টাইপ পরীক্ষক আপনাকে ম্যানুয়ালি এটি করতে হবে।

প্রদত্ত কোডটি সি # 8 এর সাথে কাজ করার জন্য রিফ্যাক্টর হয়েছে তবে এটি নতুন বৈশিষ্ট্যটির দ্বারা কোনও উপকার করে না।

public static Delegate? Combine(params Delegate?[]? delegates)
{
    // ...[]? delegates - is not null-safe, so check for null and emptiness
    if (delegates == null || delegates.Length == 0)
        return null;

    // Delegate? d - is not null-safe too
    Delegate? d = delegates[0];
    for (int i = 1; i < delegates.Length; i++)
        d = Combine(d, delegates[i]);

    return d;
}

এই বৈশিষ্ট্যটি কাজে লাগানো একটি আপডেট কোডের (কাজ করছে না, কেবল একটি ধারণা) উদাহরণ is এটি আমাদের নাল চেক থেকে রক্ষা করেছে এবং এই পদ্ধতিটি কিছুটা সহজ করেছে।

public static Delegate? Combine(params Delegate[] delegates)
{
    // `...[] delegates` - is null-safe, so just check if array is empty
    if (delegates.Length == 0) return null;

    // `d` - is null-safe too, since we know for sure `delegates` is both not null and not empty
    Delegate d = delegates[0];

    for (int i = 1; i < delegates.Length; i++)
        // then here is a problem if `Combine` returns nullable
        // probably, we can add some null-checks here OR mark `d` as nullable
        d = Combine(d, delegates[i]);

    return d;
}

2
those types are not able to contain null, নোট করুন যে এটি একটি সংকলক সতর্কতা উত্পন্ন করে , ত্রুটি নয়। কোডটি সূক্ষ্মভাবে চলবে (যদিও এটি নালরাইফারেন্স এক্সেক্সেশনগুলি উত্পন্ন করতে পারে)। এটি পিছনে সামঞ্জস্যতা মাথায় রেখে করা হয়।
জেএডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.