C#में नई वस्तु() और नई वस्तु{} के बीच अंतर क्या है?




.net resharper (2)

मेरे पास निम्नलिखित कोड स्निपेट हैं:

Expression<Func<TSource, TDest>> expression = model => new TDest{};
// Result: {model => new TestModel(){}}

ReSharper RedundantEmptyObjectOrCollectionInitializer साथ इस स्निपेट को RedundantEmptyObjectOrCollectionInitializer करता है:

Expression<Func<TSource, TDest>> expression2 = model => new TDest();
// Result: {model => new TestModel()}

उसके बाद, मेरा कोड काम नहीं करता है। घुंघराले ब्रेसिज़ को शुरू करने पर क्या प्रभाव पड़ता है?
मैंने पाया कि C # में new object() और new {} बीच अंतर क्या है? स्टैक ओवरफ्लो पर, लेकिन दोनों उदाहरण समान दिखते हैं।

expression.GetType().ToString() के बराबर है expression2.GetType().ToString()

अभिव्यक्ति पेड़ में इन आदोलन के बीच अंतर क्या है? "

var a = model => new TDest{};
var b = model => new TDest();

ReSharper आपको एक बेहतर सुझाव दे रहा है कि कैसे आप TDest क्लास को TDest

सिद्धांत रूप में, दोनों new TDest () और new TDest {} दोनों में कोई अंतर नहीं है, यह आपको TDest उदाहरण के साथ प्रदान करेगा।

हालाँकि, जब आप इनिशियलाइज़ेशन एक्सप्रेशन का उपयोग करते हैं, तो इसका कारण यह है कि आप सार्वजनिक संपत्तियों या फ़ील्ड्स को TDest में सेट करना चाहते हैं।

class TDest
{
    public string MyProperty { get; set; }
}

इसलिए आप TDest लिए एक मान सेट करने वाले TDest वर्ग को इनिशियलाइज़ कर सकते हैं। उदाहरण के लिए:

// Sample 1
new TDest { MyProperty = "This is the value of my property" };

// Sample 2
new TDest() { MyProperty = "This is the value of my property" };

आपके मामले में, आपकी कक्षा में एक पैरामीटर रहित कंस्ट्रक्टर है, इसलिए दोनों, पंक्चुएटर्स {, } या ऑपरेटर्स () ठीक होंगे।

सरल परिदृश्यों के लिए जहां आपके पास एक पैरामीटर रहित कंस्ट्रक्टर है, आप केवल TDest() शॉर्ट फॉर्म का उपयोग कर सकते हैं।

लेकिन अगर आप उदाहरण के लिए निम्न वर्ग के थे।

class TDest
{
    readonly ISomeInterface _someService;

    public string MyProperty { get; set; }

    public TDest(ISomeInterface someService)
    {
        _someService = someService;
    }
}

और आप अपने डिफ़ॉल्ट आरंभीकरण मूल्य (शून्य, संदर्भ प्रकार) के बजाय कुछ के साथ MyProperty को इनिशियलाइज़ करना चाहते थे, आप पूर्ण ऑब्जेक्ट इनिशियलाइज़ेशन का उपयोग कर सकते थे। उदाहरण के लिए:

// Sample 3
new TDest(new MySomeServiceImplementation()) { MyProperty = "This is the value of my property" };

उम्मीद है कि यह मदद करता है!

एक बेहतर विचार रखने के लिए, जाओ और सी # ऑब्जेक्ट इनिशियलाइज़र पर एक नज़र डालें।


नियमित कच्चे सी # में उत्तर "कुछ भी नहीं" होगा। हालाँकि, जब आप अभिव्यक्ति पेड़ों को शामिल करते हैं, तो एक अंतर होता है; जैसा कि here देखा जा सकता here

using System;
using System.Linq.Expressions;
public class C<TSource, TDest> where TDest : new() {
    public Expression<Func<TSource, TDest>> Foo() => model => new TDest();
    public Expression<Func<TSource, TDest>> Bar() => model => new TDest {};
}

संकलन इस प्रकार है:

public Expression<Func<TSource, TDest>> Foo()
{
    ParameterExpression parameterExpression = Expression.Parameter(typeof(TSource), "model");
    Expression arg_2E_0 = Expression.New(typeof(TDest));
    ParameterExpression[] expr_2A = new ParameterExpression[1];
    expr_2A[0] = parameterExpression;
    return Expression.Lambda<Func<TSource, TDest>>(arg_2E_0, expr_2A);
}

public Expression<Func<TSource, TDest>> Bar()
{
    ParameterExpression parameterExpression = Expression.Parameter(typeof(TSource), "model");
    Expression arg_38_0 = Expression.MemberInit(Expression.New(typeof(TDest)), Array.Empty<MemberBinding>());
    ParameterExpression[] expr_34 = new ParameterExpression[1];
    expr_34[0] = parameterExpression;
    return Expression.Lambda<Func<TSource, TDest>>(arg_38_0, expr_34);
}

तो उनमें से एक में Expression.MemberInit एक Expression.MemberInit ( MemberBinding तत्वों का एक खाली सेट के साथ) शामिल है। यह किसी LINQ प्रदाता (या किसी भी समान अभिव्यक्ति-ट्री विश्लेषण) को परेशान कर सकता है जो इसकी उम्मीद नहीं करता है।







resharper