Kaip suteikti C # Auto-Property numatytąją vertę?

Kaip suteikti C # Auto-Property numatytąją vertę? Aš naudoju konstruktorių arba grįžau į senąją sintaksę.

Konstruktoriaus naudojimas:

 class Person { public Person() { Name = "Default Name"; } public string Name { get; set; } } 

Standartinės nuosavybės sintaksės naudojimas (su numatytąją vertę)

 private string name = "Default Name"; public string Name { get { return name; } set { name = value; } } 

Ar yra geresnis būdas?

1568 m
03 сент. bentford set 03 sept. 2008-09-03 00:29 '08 at 0:29 2008-09-03 00:29
@ 23 atsakymai

„C # 5“ ir ankstesnėse versijose, kad būtų automatiškai įdiegtos savybės, turite tai padaryti konstruktoriuje.

Galimybė turėti automatinį nuosavybės iniciatorių įgalinta naudojant C # 6.0. Sintaksė:

 public int X { get; set; } = x; // C# 6 or higher 
1805 m
03 сент. Atsakyti Darren Kopp 03 Sep. 2008-09-03 00:46 '08, 12:46, 2008-09-03 00:46

Redaguota 1/2/15

C # 6 :

„C # 6“ galite automatiškai inicijuoti automatines savybes (pagaliau!), Dabar yra kitų atsakymų, kurie apibūdina šią temą.

border=0

C # 5 ir žemiau :

Nors numatomas atributo naudojimas yra ne faktiškai nustatyti turto vertes, galite naudoti refleksiją, kad visada juos nustatytumėte ...

 public class DefaultValuesTest { public DefaultValuesTest() { foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(this)) { DefaultValueAttribute myAttribute = (DefaultValueAttribute)property.Attributes[typeof(DefaultValueAttribute)]; if (myAttribute != null) { property.SetValue(this, myAttribute.Value); } } } public void DoTest() { var db = DefaultValueBool; var ds = DefaultValueString; var di = DefaultValueInt; } [System.ComponentModel.DefaultValue(true)] public bool DefaultValueBool { get; set; } [System.ComponentModel.DefaultValue("Good")] public string DefaultValueString { get; set; } [System.ComponentModel.DefaultValue(27)] public int DefaultValueInt { get; set; } } 
257
22 июня '11 в 21:14 2011-06-22 21:14 atsakymą pateikė Chuck Rostance birželio 22 d., 21:14, 2011-06-22 21:14

Įdėję kintamojo pradinę vertę, jis bus vykdomas netiesiogiai konstruktoriuje.

Sakyčiau, kad ši sintaksė buvo geriausia praktika C # –5:

 class Person { public Person() { //do anything before variable assignment //assign initial values Name = "Default Name"; //do anything after variable assignment } public string Name { get; set; } } 

Kadangi tai leidžia jums aiškiai kontroliuoti užsakymo vertes.

Su C # 6 yra naujas būdas:

 public string Name { get; set; } = "Default Name" 
137
04 сент. atsakymą pateikė „ Keith Sep 04“ 2008-09-04 15:16 '08, 15:16 pm 2008-09-04 15:16

DefaultValueAttribute ONLY veikia tik dizainerio ir Ši vertė nebus inicijuojama.

DefaultValue atributas neveikia su mano automatiniu objektu

76
03 сент. Atsakyti Darren Kopp 03 Sep. 2008-09-03 01:44 '08 ne 1:44 2008-09-03 01:44

Kartais aš jį naudoju, jei nenoriu, kad jis būtų įdiegtas ir išsaugotas mano db:

 class Person { private string _name; public string Name { get { return string.IsNullOrEmpty(_name) ? "Default Name" : _name; } set { _name = value; } } } 

Akivaizdu, kad jei tai nėra eilutė, aš galiu padaryti objektą null (dvigubai?, Int?) Ir patikrinkite, ar jis nėra nulinis, grąžina numatytąją vertę arba grąžina nustatytą vertę.

Tada galiu patikrinti savo saugykloje, kad pamatytumėte, ar tai yra mano numatytasis ir neišsaugomas, arba patikrinkite „backdoor“, kad pamatytumėte tikrąją atsarginės vertės būseną prieš išsaugant.

Tikiuosi, kad tai padės!

50
03 сент. atsakymas duotas tiglis 03 sept 2008-09-03 02:07 '08 at 2:07 2008-09-03 02:07

Nuo C # 6.0 , mes galime priskirti numatytąją vertę automatiškai įgyvendinamoms savybėms.

 public string Name { get; set; } = "Some Name"; 

Taip pat galime sukurti automatinę tik skaitymo savybę, pavyzdžiui:

 public string Name { get; } = "Some Name"; 

Žr. C # 6: pirmosios reakcijos, automatizuotų savybių iniciatoriai - Jon Skeet

32
29 апр. Habibo atsakymas yra 29 balandis 2014-04-29 17:40 '14, 17:40 pm 2014-04-29 17:40

C # 6.0, tai yra vėjas!

Tai galite padaryti pačiame Class deklaracijoje nuosavybės deklaracijos pareiškimuose.

 public class Coordinate { public int X { get; set; } = 34; // get or set auto-property with initializer public int Y { get; } = 89; // read-only auto-property with initializer public int Z { get; } // read-only auto-property with no initializer // so it has to be initialized from constructor public Coordinate() // .ctor() { Z = 42; } } 
29
25 июля '16 в 22:35 2016-07-25 22:35 Šiva atsakymą pateikė liepos 25 d. 16, 22:35 2016-07-25 22:35

C # (6.0) ir naujesnėse versijose galite:

Tik skaitymo savybėms

 public int ReadOnlyProp => 2; 

Tiek rašytinos, tiek skaitomos savybės

 public string PropTest { get; set; } = "test"; 

Dabartinėje C # (7.0) versijoje galite padaryti: (fragmentas parodo, kaip galite naudoti išraiškas su gauti / nustatyti pažangias funkcijas, kad jis būtų kompaktiškas, kai naudojamas su palaikymo laukais)

 private string label = "Default Value"; // Expression-bodied get / set accessors. public string Label { get => label; set => this.label = value; } 
17
15 марта '17 в 4:07 2017-03-15 04:07 atsakymą pateikė „ ANewGuyInTown“ kovo 15 d. 17 d. 4:07 2017-03-15 04:07

Mažas pilnas pavyzdys:

 using System.ComponentModel; private bool bShowGroup ; [Description("Show the group table"), Category("Sea"),DefaultValue(true)] public bool ShowGroup { get { return bShowGroup; } set { bShowGroup = value; } } 
11
17 июня '10 в 10:44 2010-06-17 10:44 atsakymas pateiktas ghiboz birželio 17 d. 10 val. 10:44 2010-06-17 10:44

Be jau priimto atsakymo, scenarijaus, kuriame norite apibrėžti numatytąją ypatybę kaip kitų savybių funkciją, galite naudoti išraiškos korpuso žymėjimą C # 6.0 (ir naujesnėse), kad būtų dar elegantiškesnės ir glaustesnės konstrukcijos, pavyzdžiui:

 public class Person{ public string FullName => $"{First} {Last}"; // expression body notation public string First { get; set; } = "First"; public string Last { get; set; } = "Last"; } 

Pirmiau pateiktą informaciją galite naudoti toliau

  var p = new Person(); p.FullName; // First Last p.First = "Jon"; p.Last = "Snow"; p.FullName; // Jon Snow 

Jei norite naudoti pirmiau nurodytą „=>“ žymenį, nuosavybė turi būti tik skaityti ir nenaudojate prieigos prieigos raktinio žodžio.

Informacija apie MSDN

10
30 окт. Atsakymas pateikiamas brakeroo 30 okt. 2016-10-30 05:16 '16 at 5:16 am 2016-10-30 05:16

Mano sprendimas yra naudoti priskirtą atributą, inicijuojantį numatytosios vertės inicijavimą pastoviu arba naudojamo turto tipo iniciatorių.

 [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] public class InstanceAttribute : Attribute { public bool IsConstructorCall { get; private set; } public object[] Values { get; private set; } public InstanceAttribute() : this(true) { } public InstanceAttribute(object value) : this(false, value) { } public InstanceAttribute(bool isConstructorCall, params object[] values) { IsConstructorCall = isConstructorCall; Values = values ?? new object[0]; } } 

Jei norite naudoti šį atributą, turite paveldėti klasę iš specialios bazės iniciatoriaus klasės arba naudoti statinį pagalbininko metodą:

 public abstract class DefaultValueInitializer { protected DefaultValueInitializer() { InitializeDefaultValues(this); } public static void InitializeDefaultValues(object obj) { var props = from prop in obj.GetType().GetProperties() let attrs = prop.GetCustomAttributes(typeof(InstanceAttribute), false) where attrs.Any() select new { Property = prop, Attr = ((InstanceAttribute)attrs.First()) }; foreach (var pair in props) { object value = !pair.Attr.IsConstructorCall  pair.Attr.Values.Length > 0 ? pair.Attr.Values[0] : Activator.CreateInstance(pair.Property.PropertyType, pair.Attr.Values); pair.Property.SetValue(obj, value, null); } } } 

Naudojimo pavyzdys:

 public class Simple : DefaultValueInitializer { [Instance("StringValue")] public string StringValue { get; set; } [Instance] public List<string> Items { get; set; } [Instance(true, 3,4)] public Point Point { get; set; } } public static void Main(string[] args) { var obj = new Simple { Items = {"Item1"} }; Console.WriteLine(obj.Items[0]); Console.WriteLine(obj.Point); Console.WriteLine(obj.StringValue); } 

Išvada:

 Item1 (X=3,Y=4) StringValue 
9
18 янв. atsakymas pateikiamas introspected 18 sausis 2013-01-18 01:04 '13, 1:04 2013-01-18 01:04

C # 6 ir naujesnėse versijose galite naudoti sintaksę:

 public object Foo { get; set; } = bar; 

Atkreipkite dėmesį, kad readonly nuosavybės atveju tiesiog praleiskite tokį rinkinį:

 public object Foo { get; } = bar; 

Be to, iš konstruktoriaus galite priskirti readonly automatines savybes.

Prieš tai atsakiau, kaip parodyta žemiau.

Nenoriu pridėti numatytojo konstruktoriaus; išlaikyti tai dinamiškiems priskyrimams ir venkite dviejų taškų, kuriais priskiriamas kintamasis (t. y. numatytojo tipo ir konstruktoriaus). Paprastai tokiais atvejais norėčiau tiesiog parašyti įprastą turtą.

Kita galimybė - tai, ką daro ASP.Net, ir nustatyti numatytąją vertę per atributą:

http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute.aspx

7
04 сент. atsakymas pateiktas Lex 04 sep. 2008-09-04 20:08 '08 at 8:08 pm 2008-09-04 20:08

Konstruktoriuje. Konstruktoriaus tikslas yra inicijuoti jį su duomenų nariais.

4
18 июля '16 в 19:39 2016-07-18 19:39 atsakymą pateikė RayLoveless, liepos 18 d., „16, 19:39 2016-07-18 19:39

Ar bandėte naudoti „ DefaultValueAttribute“ arba „ HaveSerialize“ ir „Reset “ kartu su dizaineriu? Manau, kad vienas iš šių dviejų metodų yra būtinas, jei kuriate klasę, kuri gali būti rodoma konstruktoriaus ar turto tinklelio paviršiuje.

2
03 сент. OwenP atsakymas, pateiktas rugsėjo 3 d. 2008-09-03 00:32 '08 ne 0:32 2008-09-03 00:32
 public Class ClassName{ public int PropName{get;set;} public ClassName{ PropName=0; //Default Value } } 
2
04 сент. Atsakymą pateikė FloodMoo 04 Sep. 2014-09-04 23:44 '14, 23:44 2014-09-04 23:44
 private string name; public string Name { get { if(name == null) { name = "Default Name"; } return name; } set { name = value; } } 
2
01 нояб. atsakymas pateiktas ComeIn 01 Nov. 2018-11-01 17:51 '18 at 17:51 pm 2018-11-01 17:51

Naudokite konstruktorių, nes „Kai baigiamas statybininkas, konstrukcija turi būti baigta.“ ypatybės yra panašios į klasių saugomas būsenas, jei reikia inicijuoti numatytąją būseną, tai padarytumėte savo konstruktoriuje.

1
11 янв. atsakymą Preet Singh pateikė sausio 11 d. 2016-01-11 14:33 '16 at 14:33 pm 2016-01-11 14:33

Asmeniškai aš nematau taško, kaip tai daryti kaip turtą, jei nesate ketinate nieko daryti ne automobilyje. Tiesiog palikite jį kaip >

Hmm ... galbūt tai bus jo paties klausimo klausimas

1
03 сент. Atsakyti Joel Coehoorn Sep 3 2008-09-03 06:43 '08 at 6:43 2008-09-03 06:43

Norėdami paaiškinti, taip, jums reikia nustatyti numatytąją vertę konstruktoriui klasės objektams. Jums reikės įsitikinti, kad konstruktorius turi atitinkamą prieigos modifikatorių pastatui, kuriame jis naudojamas. Pavyzdžiui, jei objektas nėra sukurtas. ji neturi konstruktoriaus (pvz., statiniai metodai), tada numatytąją vertę gali nustatyti laukas. Pavyzdys čia yra tas, kad pats objektas bus sukurtas tik vieną kartą, ir jūs to nesukursite.

@ Darrenas Koppas yra geras atsakymas, švarus ir teisingas. Ir kartoju, galite parašyti konstruktorius abstrakčiams metodams. Rašydami konstruktorių tiesiog reikia prieiti prie jų iš bazinės klasės:

Pagrindinės klasės konstruktorius:

 public BaseClassAbstract() { this.PropertyName = "Default Name"; } 

Konstruktorius išvestas / betonas / subklasė:

 public SubClass() : base() { } 

Čia yra ta, kad iš bazinės klasės paimtas egzemplioriaus kintamasis gali palaidoti pagrindinio lauko pavadinimą. Nustatykite dabartinę objekto objekto vertę naudodami „tai“. leis jums tinkamai suformuoti savo objektą, atsižvelgiant į esamą egzempliorių ir reikiamus leidimo lygius (prieigos modifikatorius), kuriuose jį sukuriate.

1
31 июля '12 в 14:02 2012-07-31 14:02 atsakymą pateikė Zack Jannsen, liepos 31 d., 12:02, 2012-07-31 14:02
 class Person { /// Gets/sets a value indicating whether auto /// save of review layer is enabled or not [System.ComponentModel.DefaultValue(true)] public bool AutoSaveReviewLayer { get; set; } } 
0
26 мая '11 в 22:29 2011-05-26 22:29 atsakymą pateikė „ Nag “ gegužės 26 d. 11 val. 22:29 2011-05-26 22:29

Manau, kad tai būtų daroma, kai kai kurie „Fagag“ nustatymai yra neteisingi.

 private bool _SomeFlagSet = false; public bool SomeFlag { get { if (!_SomeFlagSet) SomeFlag = false; return SomeFlag; } set { if (!_SomeFlagSet) _SomeFlagSet = true; SomeFlag = value; } } 
-2
07 дек. atsakymas pateiktas vartotojo3076134 07 dec. 2013-12-07 00:50 '13 - 0:50 2013-12-07 00:50

Įveskite „Prop“ ir spustelėkite „TAB“ ir „Visual Studio“. Pateikite šį kodą

 public int MyProperty { get; set; } 

po to, kai galite pakeisti modifikatorių, duomenų tipą, pavadinimą ir lengvai priskirti rinkinį ir gauti vertes.

jei turite naudoti kintamąjį kitoje klasėje , galite naudoti abi,

 public static int MyProperty { get; set; } 

kode galite priskirti kintamąjį

 MyProperty=1; 

kitoje klasėje, kurią galite naudoti ,

 MessageBox.Show(Classname.MyProperty); 
-3
05 апр. Atsakymą pateikė Gayan Chinthaka Dharmarathna 05 Bal. 2017-04-05 07:12 '17 at 7:12 2017-04-05 07:12

suformatuota eilutėje, naudojant konstruktorius iniciacijai yra bloga praktika ir vėliau vėlesni pokyčiai bus drastiškesni.

-5
13 сент. atsakymas pateikiamas dbobrowski 13 sep . 2012-09-13 22:13 '12, 10:13 PM 2012-09-13 22:13

Kiti klausimai apie žymę arba Užduoti klausimą