কোনও ওআরএম দিয়ে ডিটিও ক্লাস ব্যবহার করার সময় সি # 8-এ নুলযোগ্য রেফারেন্স প্রকার


9

আমি নীচে দেওয়া হিসাবে ডেটা ট্রান্সফার অবজেক্ট (ডিটিও) শ্রেণিযুক্ত একটি প্রকল্পে এই বৈশিষ্ট্যটি সক্রিয় করেছি:

public class Connection
    {
        public string ServiceUrl { get; set; }
        public string? UserName { get; set; }
        public string? Password { get; set; }
        //... others 
    }

তবে আমি ত্রুটি পেয়েছি:

CS8618: নন-অযোগ্য সম্পত্তি 'সার্ভিস ইউআরএল' অবিচ্ছিন্ন is সম্পত্তি অযোগ্য হিসাবে ঘোষণা বিবেচনা করুন।

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

উদাহরণস্বরূপ, কলার করতে পারেন:

var connection = new Connection
{
  ServiceUrl=some_value,
  //...
}

আমার প্রশ্ন: সি # 8 এর নালিয়াযোগ্যতা প্রসঙ্গটি সক্ষম থাকলে ডিটিও ক্লাসে এই জাতীয় ত্রুটিগুলি কীভাবে পরিচালনা করবেন?


3
আপনি যখন দেখানোর মতোভাবে নির্মাণের সূচনাটি করেন, তখন ডিফল্ট কনস্ট্রাক্টর চালিত হয় (সার্ভিসআরএলকে তার ডিফল্ট মানটিতে শুরু করা হয় (যা স্ট্রিংগুলির জন্য নাল হয়))। তারপরে, আরম্ভের বিবৃতিটি চালিত হয়। আপনি যদি এটি অ-অযোগ্য চান, তবে এটির
শুরুতে

পোকোর অর্থ এই নয় যে এর কোনও নির্মাণকারী নেই বা বৈশিষ্ট্যগুলি আরম্ভ করা হয়নি। এর অর্থ Plain Old C# Object। কোনও বিশেষ শ্রেণীর উত্তরাধিকারসূত্রে ছাড়াই অন্য যে কোনও জিনিস যেমন ঠিক তেমন। আমি সন্দেহ করি আপনার একটি আলাদা প্রশ্ন আছে। ডিটিওগুলি কীভাবে তৈরি করবেন -Data Transfer Objects
পানাজিওটিস কানভোস

This should be the responsibility of the one initializing the class to ensure that the properties are non-nullবর্গ সর্বদা একটি বৈধ অবস্থায় থাকা উচিত। যদি nullঅনুমতি না দেওয়া হয় তবে সম্পত্তিটি কখনই শূন্য হওয়া উচিত নয় । সম্ভবত, একটি মৌলিক স্ট্রিংয়ের পরিবর্তে আপনার ইউআরএলটির জন্য একটি বিশেষায়িত ক্লাস ব্যবহার করা উচিত Noneযা এফ # এর বিকল্প শ্রেণীর মতো or` মিসিং` এর মান থাকতে পারে । সি # 8 আপনাকে এ জাতীয় ক্লাস লিখতে এবং প্যাটার্ন
ম্যাচিংয়ের

@ পানাগিওটিস কানভোস, আমার ক্ষেত্রে ক্লাসটির প্যারামিটার-কম কনস্ট্রাক্টর হওয়ার সীমাবদ্ধতা রয়েছে। তাই আমি প্রপার্টি সূচনাকারী ব্যবহার করতে হবে: public string ServiceUrl { get; set; } = default! ;। আমি আশা করি রোজলিনের ভবিষ্যতে কর্টরের সুযোগের বাইরে লেট ইনিশিয়েশনাল পরিচালনা করার উপায় থাকতে পারে। আমি মেবে <T> (বিকল্প ক্লাসের মতো) ব্যবহার করছিলাম, তবে নতুন কোডের জন্য আমি সি # 8-তে প্রকারের রেফারেন্স টাইপটিতে স্যুইচ করেছি।
এম হাসান 13

এনআরটি মায়বস নয়, বাস্তবে, মায়বস এখন আরও গুরুত্বপূর্ণ এবং ব্যবহার করা সহজ। অবশ্যই তারা সি # আইডিয়াম ব্যবহার করে তৈরি করছে যা তাদের প্যাটার্ন
ম্যাচিংয়ের

উত্তর:


9

পরবর্তী সমাধানটি EF কোর এবং EF6 দেখুন দ্বারা প্রস্তাবিত

1) null!ক্ষমা অপারেটর দিয়ে শুরু করে

public string ServiceUrl { get; set; } = null! ;
//or
public string ServiceUrl { get; set; } = default! ;

2) ব্যাকিং ফিল্ড ব্যবহার:

        private string _ServiceUrl;
        public string ServiceUrl
        {
            set => _ServiceUrl = value;
            get => _ServiceUrl
                   ?? throw new InvalidOperationException("Uninitialized property: " + nameof(ServiceUrl));
        }


প্রশ্নটিতে উল্লেখ করা হয়েছে যে তিনি !অপারেটরটি ব্যবহার করতে পারবেন না ।
অ্যাথানাসিওস কাতারস

আমি ব্যবহার করতে পারি না! টাইপ সহ, তবে আমি উল্লিখিত লিঙ্কটি নাল ব্যবহার করে কীভাবে আরম্ভ করতে হবে তা দেখায় !. এটি একটি কার্যকর সমাধান। আমি প্রশ্নটি পরিবর্তন করেছি।
এম হাসান

8

যদি এটি অযোগ্য হয়, তবে বস্তুটি আরম্ভ করার সাথে সংকলক কী করতে পারে?

স্ট্রিংয়ের ডিফল্ট মানটি নাল, সুতরাং আপনি এটি করুন

  1. হয় ঘোষণার মধ্যে একটি স্ট্রিং ডিফল্ট মান নির্ধারণ করা প্রয়োজন

    public string ServiceUrl { get; set; } = String.Empty;

  2. বা ডিফল্ট কনস্ট্রাক্টরের মানটি আরম্ভ করুন যাতে আপনি সতর্কতা থেকে মুক্তি পাবেন

  3. !অপারেটরটি ব্যবহার করুন (যা আপনি ব্যবহার করতে পারবেন না)

  4. রবপ্রাইস্টলি উল্লিখিত হিসাবে এটি naclaable করুন।


4
অথবা অবশ্যই কোনও নন-অযোগ্য স্ট্রিং হিসাবে পরিষেবা URL টি গ্রহণ করে এমন কোনও কনস্ট্রাক্টর যুক্ত করুন।
জন স্কিটি

ServiceUrl'স্ট্রিং.এম্পটি হতে পারে না। জটিল ধরণের অন্যান্য বৈশিষ্ট্যগুলিও বাতিল হতে পারে না, তাই আমি এর defaultমতো ব্যবহার করেছি : 'পাবলিক মাই ক্লাস মাইপ্রোপার্টি {পেতে; সেট; default = ডিফল্ট! 'সতর্কতা বন্ধ করতে। এই শ্রেণিটি (এবং অন্যরা) প্যারামিটার-কম কমস্ট্রাক্টর এবং ইদানীং কর্টারের ক্ষেত্রের বাইরে আরম্ভ করা হয়েছে।
এম হাসান

0

অন্য পরিস্থিতিতে যা কিছু পরিস্থিতিতে কার্যকর হতে পারে:

[SuppressMessage("Compiler", "CS8618")]

সদস্য বা পুরো টাইপের শীর্ষে ব্যবহার করা যেতে পারে।


তবুও অন্য একটি বিষয় বিবেচনা #nullable disableকরতে হবে পুরো ফাইলটির জন্য অযোগ্য রেফারেন্স অক্ষম করতে ফাইলের শীর্ষে।

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