ORM के साथ DTO कक्षाओं का उपयोग करते समय C # 8 में अशक्त संदर्भ प्रकार


9

मैंने इस सुविधा को प्रोजेक्ट में डेटा ट्रांसफर ऑब्जेक्ट (डीटीओ) वर्गों में सक्रिय किया है, जैसा कि नीचे दिया गया है:

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

लेकिन मुझे त्रुटि मिलती है:

CS8618: गैर-अशक्त संपत्ति 'ServiceUrl' असिंचित है। संपत्ति को अशक्त घोषित करने पर विचार करें।

यह एक डीटीओ वर्ग है, इसलिए मैं गुणों को शुरू नहीं कर रहा हूं। यह गुण को गैर-अशक्त बनाने के लिए वर्ग को आरम्भ करने की कोड की जिम्मेदारी होगी।

उदाहरण के लिए, कॉलर कर सकता है:

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

मेरा प्रश्न: C # 8 की अशक्तता संदर्भ सक्षम होने पर डीटीओ कक्षाओं में ऐसी त्रुटियों को कैसे संभालना है?


3
जब आप निर्माण इनिशियलाइज़ेशन जिस तरह से दिखाते हैं, तो डिफॉल्ट कंस्ट्रक्टर चलता है (ServiceUrl को उसके डिफ़ॉल्ट मान (जो स्ट्रिंग्स के लिए, शून्य है) को शुरू करता है)। फिर, इनिशियलाइज़ स्टेटमेंट चलता है। यदि आप इसे गैर-
अशक्त

POCO का मतलब यह नहीं है कि इसका कोई निर्माता नहीं है या यह कि गुण प्रारंभिक नहीं हैं। इसका मतलब है 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अनुमति नहीं है, तो संपत्ति कभी भी अशक्त नहीं होनी चाहिए । शायद, एक मूल स्ट्रिंग के बजाय आपको URL के लिए एक विशेष वर्ग का उपयोग करना चाहिए Noneजिसमें F # में विकल्प वर्ग की तरह या 'Missing` का मान हो सकता है । C # 8 आपको ऐसी कक्षाएं लिखने और पैटर्न मिलान के साथ उनकी जांच करने की अनुमति देता है
Panagiotis Kanavos

@Panagiotis Kanavos, वर्ग, मेरे मामले में, पैरामीटर-कम कंस्ट्रक्टर होने के लिए एक बाधा है। इसलिए मुझे संपत्ति प्रारंभिक का उपयोग करना होगा public string ServiceUrl { get; set; } = default! ;:। मुझे उम्मीद है कि रोजलिन के पास भविष्य में लेटर इनिशियलाइजेशन को संभालने के लिए एक रास्ता हो सकता है। मैं MayBe <T> (विकल्प वर्ग की तरह) का उपयोग कर रहा था, लेकिन मैंने नए कोड के लिए c # 8 में अशक्त संदर्भ प्रकार पर स्विच किया।
एम। हसन 13

NRTs नहीं Maybes, वास्तव में, Maybes अब भी कर रहे हैं और अधिक महत्वपूर्ण है और उपयोग करने के लिए आसान। निश्चित रूप से वे C # मुहावरों का उपयोग कर निर्माण कर रहे हैं जो उन्हें पैटर्न मिलान के साथ काम करने में आसान बनाते हैं
Panagiotis Kanavos

जवाबों:


12

अगले समाधान एफई कोर और 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. उल्लेख के रूप में इसे अशक्त बनायें।


4
या सेवा के URL को गैर-अशक्त स्ट्रिंग के रूप में स्वीकार करने वाला एक निर्माता जोड़ें।
जॉन स्कीट

ServiceUrl'नहीं हो सकता = String.Empty। जटिल प्रकार के अन्य गुण हैं जो अशक्त नहीं हो सकते हैं, इसलिए मैंने इस्तेमाल किया default: 'सार्वजनिक MyClass MyProperty {get; सेट; } = डिफ़ॉल्ट! 'चेतावनी को रोकने के लिए। यह वर्ग (और अन्य) पैरामीटर-कम निर्माणकर्ता है और हाल ही में ctor के दायरे से बाहर है।
एम। हसन

1

एक और बात जो कुछ परिदृश्यों में काम आ सकती है:

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

सदस्य या पूरे प्रकार के शीर्ष पर उपयोग किया जा सकता है।


फिर भी विचार करने के लिए एक और चीज #nullable disableपूरी फाइल के लिए अशक्त संदर्भ को अक्षम करने के लिए फ़ाइल के शीर्ष पर जोड़ रही है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.