C # Auto-Property-u necə default dəyərinə necə verirsiniz?

C # Auto-Property-u necə default dəyərinə necə verirsiniz? Mən ya qurucu istifadə, ya da köhnə sintaksisinə geri qayıdıram.

Quraşdırıcı istifadə:

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

Standart xüsusiyyət sintaksisindən istifadə (default dəyər ilə)

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

Daha yaxşı bir yol varmı?

1568
03 сент. bentford dəsti 03 sept. 2008-09-03 00:29 '08 at 0:29 2008-09-03 00:29
@ 23 cavab

C # 5 və əvvəlki versiyalarında, avtomatik olaraq tətbiq olunan xüsusiyyətləri default dəyər vermək üçün bunu konstruktorda etməlisiniz.

Avtomatik mülkiyyət başlatma mübadiləsi qabiliyyəti C # 6 ilə effektivdir. Sintaksis:

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

1/2/15

C # 6 :

C # 6 ilə birbaşa avtomatik olaraq xüsusiyyətləri başlaya bilərsiniz (nəhayət!), İndi bunları təsvir edən mövzuya başqa cavablar da var.

border=0

C # 5 və aşağıda :

Bir xüsusiyyətin nəzərdə tutulan istifadəsi, həqiqətən, əmlak dəyərlərini təyin etmək deyil, baxmayaraq ki, əksinə hər zaman onları təyin etmək üçün əksini istifadə edə bilərsiniz ...

 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 Cavab Chuck Rostance tərəfindən 22 iyun 'da 21:14' də verildi 2011-06-22 21:14

Bir dəyişən üçün başlanğıc dəyərini yerləşdirdiyiniz zaman konstruktorda örtülü olaraq icra ediləcəkdir.

Bu sintaksis C # -dən 5-ə ən yaxşı təcrübə olduğunu söyləyərdim:

 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; } } 

Sifariş dəyərlərinizə açıq bir nəzarət verir.

C # ilə yeni bir yol var:

 public string Name { get; set; } = "Default Name" 
137
04 сент. Cavab Sep 04 tərəfindən verilir 2008-09-04 15:16 '08 at 3:16 pm 2008-09-04 15:16

DefaultValueAttribute yalnız dizayner və s. Bu dəyər üçün mülkü başlamaq olmaz.

DefaultValue Özniteliğim Auto Object ilə işləmir

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

Mən, həqiqətən, həqiqətən quraşdırılmasını və db-də saxlanmasını istəmirəmsə bəzən onu istifadə edirəm:

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

Şübhəsiz ki, bu bir simli deyilsə, obyektin boşluğunu (double?, İnt?) Edə bilərəm. Null yoxsa yoxsa default dəyərini qaytarın və ya təyin olunan dəyəri qaytarın.

Sonra mənim depolarımda mənim default olub olmadığını və saxlanılmadığını yoxlamaq və ya saxlamadan əvvəl ehtiyatın əsl statusunu görmək üçün arxa arxivini yoxlaya bilərsiniz.

Bu kömək edir!

50
03 сент. Cavab verilir 03 sentyabr. 2008-09-03 02:07 '08 at 2:07 'da 2008-09-03 02:07

C # 6'dan başlayaraq, avtomatik olaraq tətbiq olunan xüsusiyyətlər üçün bir u mənim dəyər təyin edə bilərik.

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

Məsələn, avtomatik olaraq oxuya biləcək xüsusiyyət yaratmaq olar:

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

Bax: C # 6: ilk reaksiyalar, avtomatik olaraq tətbiq olunan xassələr üçün başlanğıclar - Jon Skeet

32
29 апр. Habib cavab 29 Apr edir 2014-04-29 17:40 '14, 5:40 pm 2014-04-29 17:40

C # 6-da, bu bir salam!

Bunu əmlak bəyannaməsi ifadələrində Class bəyannaməsində özü edə bilərsiniz.

 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 Cavab Shiva tərəfindən 25 iyul '16' da 22:35 'də 2016-07-25 22:35' də verilir

C # (6.0) və daha yüksək səviyyədə aşağıdakıları edə bilərsiniz:

Readonly xüsusiyyətləri üçün

 public int ReadOnlyProp => 2; 

Yazılı və Readable xüsusiyyətləri üçün də

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

C # (7.0) -in hazırkı versiyasında bunu edə bilərsiniz: (fraqment daha çox dəstək sahələri ilə istifadə edərkən daha kompakt etmək üçün getdikləri / inkişaf etmiş funksiyaları ilə ifadələri necə istifadə edə bilərsiniz)

 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 Cavab ANEWGuyInTown tərəfindən verilir 15 Mart 'da 4:07' də 2017-03-15 04:07

Kiçik tam nümunə:

 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 Cavab ghiboz 17 iyun 10: 10-da verilir. 2010-06-17 10:44

Cavabın qəbul edilməsinə əlavə olaraq, digər əmlakın funksiyası kimi default əmlakı müəyyən etmək istədiyiniz bir ssenari üçün, C # 6.0 (və daha yüksək) ifadəsinin gövdəsinin notasını aşağıdakı kimi daha zərif və qısa konstruksiyalar üçün istifadə edə bilərsiniz:

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

Yuxarıdakıları aşağıdakı kimi istifadə edə bilərsiniz

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

Yuxarıdakı qeyddən istifadə etmək üçün "=>", əmlak yalnız oxunmalı və get accessor sözünü istifadə etməyin.

MSDN haqqında ətraflı məlumat

10
30 окт. Cavab 30 Yanvar sürət qutusuna verilir . 2016-10-30 05:16 '16 saat 05:16 'da 2016-10-30 05:16

Mənim həllim bir sabit dəyəri ilə bir default dəyərinin başlanmasını başlatan və ya bir əmlak növü başlatma istifadə edən xüsusi bir atributu istifadə etməkdir.

 [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]; } } 

Bu xüsusiyyətdən istifadə etmək üçün sinfi xüsusi bir əsas ilkin başlanğıc sinifindən devralmalı və ya statik köməkçi metoddan istifadə etməlisiniz:

 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); } } } 

İstifadə nümunəsi:

 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); } 

Nəticə:

 Item1 (X=3,Y=4) StringValue 
9
18 янв. cavab 18 yanvar introspected verilir 2013-01-18 01:04 '13 'da 1:04' də 2013-01-18 01:04

C # və yuxarı səviyyədə sadəcə sözdizimini istifadə edə bilərsiniz:

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

readonly mülk üçün, sadəcə readonly :

 public object Foo { get; } = bar; 

Ayrıca, readonly avtomatik xüsusiyyətlər təyin edə bilərsiniz.

Bundan əvvəl aşağıda göstərildiyi kimi cavab verdim.

Mən bir default qurucu əlavə etməyəcəyəm; dinamik tapşırıqlar üçün saxlamaq və bir dəyişənin təyin olunduğu iki xal (yəni bir default növü və konstruktorda) olmamasından çəkinin. Normalda bu cür hallarda normal bir əmlak yazacağam.

Başqa bir variant ASP.Net'in nə etdiyədiyini və özniteliğiyle varsayılan değerleri belirlemektir:

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

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

Qurucuda. Konstruktorun məqsədi onu məlumat üzvləri ilə başlamaqdır.

4
18 июля '16 в 19:39 2016-07-18 19:39 Cavab RayLoveless tərəfindən verilir 18 İyul, 19:39 19:39 2016-07-18 19:39

DefaultValueAttribute istifadə etməyi sınadınızmı və ya bir dizaynerlə birlikdə Serialın və Sıfırlamayı sıfırlamalıydınız ? Bir qurucunun səthində və ya əmlak şəbəkəsində göstərilə biləcək bir sinif yaratsanız, bu iki üsuldan birinin lazım olduğunu hiss edirəm.

2
03 сент. 03 sentyabrda OwenP tərəfindən verilmiş cavab 2008-09-03 00:32 '08 at 0:32 2008-09-03 00:32
 public Class ClassName{ public int PropName{get;set;} public ClassName{ PropName=0; //Default Value } } 
2
04 сент. Cavab FloodMoo tərəfindən verilir 04 Sep. 2014-09-04 23:44 '14 saat 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 нояб. Cavab verildi. 2018-11-01 17:51 '18 də 5:51 'də 2018-11-01 17:51' də

Konstruktordan istifadə edin, çünki "Konstruktor başa çatdıqda tikinti tamamlanmalıdır". Sifarişlərinizin saxladığı dövlətlərə bənzər xüsusiyyətlər, əgər siz default dövlətin başlanğıcını tələb etsəniz, bunu konstruktorunuzda edəcəksiniz.

1
11 янв. Cavab 11 yanvar tarixində Preet Singh tərəfindən verilir . 2016-01-11 14:33 '16 saat 14:33 'də 2016-01-11 14:33

Şəxsən, avtomatik mülkiyyətin xaricində heç bir şey etməyəcəyi təqdirdə, heç bir mülk olaraq bunu etmək nöqtəsini görmürəm. Yalnız bir qutu olaraq buraxın. Bu elementi əhatə etmənin üstünlüyü sadəcə qırmızı sviterdir, çünki qapalı arxasında heç bir şey yoxdur. Baza tətbiqini dəyişdirməyiniz lazım olsa, hər hansı bir asılı kodu pozmadan xüsusiyyətləri yenidən təşkil edə bilərsiniz.

Hmm ... bəlkə sonra öz sualına bir sual olacaq

1
03 сент. Cavab Joel Coehoorn Sep 3 2008-09-03 06:43 '08 saat 06:43 'da 2008-09-03 06:43

Aydınlaşdırmaq üçün, bəli, sinif obyektləri üçün konstruktorda default dəyərləri təyin etməlisiniz. Konstruktorun istifadə edildiyi yerdə tikinti üçün müvafiq giriş modifikatoru ilə mövcud olduğundan əmin olmaq lazımdır. Məsələn, obyekt yaradılmır. heç bir konstruktor yoxdur (məsələn, statik metodlar), sonra da default dəyər sahə tərəfindən təyin edilə bilər. Burada nümunə, obyektin özü yalnız bir dəfə yaradılacaq və onu yaratmırsınız.

@ Darren Kopp yaxşı bir cavab, təmiz və doğru. Və təkrar edirəm ki, abstrakt üsullar üçün konstruktor yaza bilərsiniz. Konstruktor yazarkən yalnız əsas sinifdən istifadə etmək lazımdır:

Əsas sinifdə konstruktor:

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

Tərtib olunmuş konstruktor / Beton / Alt sinfi:

 public SubClass() : base() { } 

Buradakı nöqtə, əsas sinifdən götürülmüş bir nümunə dəyişəninin əsas sahənin adını basdırmasıdır. "Bu" istifadə edərək, obyektin cari dəyərini təyin edin. mövcud nüsxə və yaratdığınız tələb olunan icazə səviyyələrinə (giriş modifikasiyasına) münasibətdə obyektin düzgün formalaşdırılmasına imkan verəcəkdir.

1
31 июля '12 в 14:02 2012-07-31 14:02 Cavab Zack Jannsen tərəfindən verilib 31 iyul '13 saat 14:02 'da 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 cavab 26 may 2011-ci il tarixində saat 22: 29-da verilir. 2011-05-26 22:29

Hesab edirəm ki, bu, bəzi Flag funksiyalarını yalana vermək üçün edərdi.

 private bool _SomeFlagSet = false; public bool SomeFlag { get { if (!_SomeFlagSet) SomeFlag = false; return SomeFlag; } set { if (!_SomeFlagSet) _SomeFlagSet = true; SomeFlag = value; } } 
-2
07 дек. Cavab İstifadəçi tərəfindən verilir3076134 07 dekabr . 2013-12-07 00:50 '13 'da 0:50' da 2013-12-07 00:50

Prop daxil edin və "TAB" və Visual Studio basın. Aşağıdakı kodu təklif edin

 public int MyProperty { get; set; } 

modifikator, məlumat növü, adını dəyişdirə bilərsiniz və asanlıqla bir set təyin edir və dəyərləri əldə edə bilərsiniz.

başqa bir sinifdə bir dəyişəndən istifadə etsəniz, hər ikinizdən də istifadə edə bilərsiniz,

 public static int MyProperty { get; set; } 

kodda dəyişən təyin edə bilərsiniz

 MyProperty=1; 

istifadə edə biləcək başqa bir sinifdə,

 MessageBox.Show(Classname.MyProperty); 
-3
05 апр. Cavab Gayan Chinthaka Dharmarathna tərəfindən verilir 05 Aprel. 2017-04-05 07:12 '17 də 7:12 'də 2017-04-05 07:12' də

başlanğıc üçün konstruktorlardan istifadə edərək, bir düsturla işə salındıqdan sonra pis bir təcrübədir və daha sonra daha ciddi dəyişikliklərə səbəb olacaq.

-5
13 сент. cavab dbobrowski 13 sep verilir . 2012-09-13 22:13 '12 at 10:13 PM 2012-09-13 22:13

etiketinə aid digər suallar və ya sual verin