2017-02-01 16 views
9

C# 7'de, 2 parametreyi kullanarak böyle bir İfade Gömülü Oluşturucu yazabilirim.C# 7 İfadeli Gömülü Yapıcılar

public Person(string name, int age) 
{ 
    Name = name; 
    Age = age; 
} 
+1

Tamam. Hızlı cevabınız için teşekkür ederim. – myfunnyfella

+0

Bu fikir UserVoice'de pek çok kez gündeme getirildi ve göz ardı edildi. Lütfen oylama yapın, böylece fikir biraz çekişebilir. 2017 - C# bağımlılık enjeksiyonu için daha iyi kısaltılmış olmalı! https://visualstudio.uservoice.com/forums/121579-visual-studio-ide/suggestions/17225666-automatic-constructor-parameter-setters – pbarranis

cevap

12

Temelde değilsiniz. İfade gövdeli üyeler, yalnızca yürütmek için tek bir ifadeniz olduğunda kullanılabilir. Bu durumda iki tane var.

Sana olabilir kullanım tuples tabii ama ben şiddetle karşı tavsiye: Artık ettik çünkü çalışır

// DO NOT USE THIS CODE - IT'S JUST TO DEMONSTRATE THE FEASIBILITY 
public class Person 
{ 
    private readonly (string name, int age) tuple; 

    public string Name => tuple.name; 
    public int Age => tuple.age; 

    public Person(string name, int age) => tuple = (name, age); 
} 

yalnızca bir deyim (tuple = (name, age);) aldık. Ama kesinlikle alanlarınızı değiştirmemelisiniz, böylece bir ifade gövdeli kurucu kullanabilirsiniz.

+2

Bu örnekte çalışmak için de bu paketi kurmanız gerekiyor. ValueTuple': 'install-package System.ValueTuple' –

24

-

(. Bu biraz daha hoş, ama IMO yapmaya değer hala değil David gösterildiği gibi, daha sonra başlığın inşa edebilirsiniz da doğrudan salt okunur otomatik sahne için deconstruct)

bunu yapmanın bir yolu, bir ifadede birden atamaları izin vermek için bir başlığın ve dekonstrüksiyonizmden kullanmaktır:

C# 7.1 itibariyle
public class Person 
{ 
    public string Name { get; } 
    public int Age { get; } 

    public Person(string name, int age) => (Name, Age) = (name, age); 
} 

(Visual Studio 2017 Güncelleme 3 ile tanıtılan), derleyici kodu artık uzak optimize eder tuple fiili inşaat ve yapısöküm. Dolayısıyla, bu yaklaşımın "uzun" ödevle kıyaslandığında performans yükü yoktur.

+7

Güzel, bu gibi deconstructing hakkında düşünmemiştim ... –

+1

Bu kötülüktür. C# 7.1 kullanıyorum ve bunu göremiyorum. –

+0

@PanagiotisKanavos, hangi şekilde kötülük nedir? C# 7.1 gibi, bunu kullanmaya başladım, bana temiz bir çözüm gibi geliyor. –