C # 3.0 automatické vlastnosti - užitečná, nebo ne?

hlasů
139

Poznámka: To byl vyslán, když jsem začínal C #. S 2014 znalostí, mohu opravdu říci, že auto-vlastnosti jsou jedním z nejlepších věcí, které na jazyce C # nestalo.

Jsem zvyklý vytvářet své vlastnosti v jazyce C # pomocí soukromé a veřejné pole:

private string title;
public string Title
{
    get { return title;  }
    set { title = value;  }
}

Nyní, s .NET 3.0, máme automatické vlastnosti:

public string Title { get; set; }

Vím, že to je více filozofický / subjektivní otázka, ale je tam nějaký důvod, proč použít tyto automatické vlastnosti s výjimkou ukládání pět řádků kódu pro každé pole? Můj osobní remcání je, že tyto vlastnosti se skrývají věci přede mnou, a já nejsem velký fanoušek černé magie.

Ve skutečnosti je skryto v soukromí pole ani zobrazovat v debuggeru, který je OK danou skutečnost, že funkce get / set dělat nic. Ale když chci skutečně realizovat nějaké kariérista / setter logiku, musím přesto použít soukromý / veřejný pár.

Vidím tu výhodu, že jsem ušetřit spoustu kódu (jeden vs šest řádků), aniž by ztratily schopnost měnit logiku kariérista / setter později, ale na druhou stranu jsem již může dělat, že se omezila na prohlášení veřejného pole „public String Title“, aniž že je třeba z {get; soubor; } Blokovat, a tím i úsporu více kódu.

Takže, co jsem chybí tady? Proč by někdo skutečně chtějí používat automatické vlastnosti?

Položena 13/08/2008 v 00:06
zdroj uživatelem
V jiných jazycích...                            


18 odpovědí

hlasů
103

Používáme je všechen čas přetečení zásobníku.

Také by vás mohlo zajímat diskuzi o vlastnostech vs. veřejné proměnné . IMHO je to opravdu to, co je to reakce na, a za tímto účelem, je to skvělé.

Odpovězeno 13/08/2008 v 00:13
zdroj uživatelem

hlasů
54

Ano, je to jen uložit kód. Je to míle čitelnější, když mají spoustu z nich. Jsou rychleji psát a snadněji se udržuje. Úsporné kód je vždy dobrý cíl.

Můžete nastavit různé obory:

public string PropertyName { get; private set; }

Tak, že nemovitost může být změněna pouze uvnitř třídy. To není opravdu neměnná, jak můžete i nadále používat privátní seřizovač prostřednictvím reflexe.

Jak C # 6 můžete také vytvořit skutečné readonlyvlastnosti - tedy neměnné vlastnosti, které nelze změnit mimo konstruktoru:

public string PropertyName { get; }

public MyClass() { this.PropertyName = "whatever"; }

V době kompilace, které budou:

readonly string pName;
public string PropertyName { get { return this.pName; } }

public MyClass() { this.pName = "whatever"; }

V neměnných tříd se spoustou členů ušetří spoustu nadbytečného kódu.

Odpovězeno 13/08/2008 v 08:09
zdroj uživatelem

hlasů
40

Tyto tři velké stinné stránky pomocí polí místo vlastnosti jsou:

  1. Nemůžete DataBind na poli, zatímco se můžete na vlastnost
  2. Máte-li začít používat pole, nemůžete později (snadno) změnit je na pozemku
  3. Tam jsou některé atributy, které můžete přidat k majetku, který nelze vložit do pole
Odpovězeno 13/08/2008 v 00:13
zdroj uživatelem

hlasů
27

Já osobně miluju automatické vlastnosti. Co je špatného na úsporu řádky kódu? Chcete-li dělat věci v getry a seřizovačů, není žádný problém převést na normální vlastností později.

Jak jste řekl, že jste mohli použít pole, a pokud jste chtěli přidat logiku k nim druhý byste je převést do vlastností. Ale to může představovat problém s jakýmkoliv použitím odrazu (a možná jinde?).

Také vlastnosti umožňují nastavit různé úrovně přístupu pro získání a nastavení, které nemůžete dělat s polem.

Myslím, že je to stejné, jako klíčového slova var. Věc osobních preferencí.

Odpovězeno 13/08/2008 v 00:13
zdroj uživatelem

hlasů
23

Od Bjarne Stroustrup, tvůrce C ++:

Zejména se mi nelíbí tříd se spoustou získání a nastavení funkcí. To je často známkou toho, že by nemělo být třídy na prvním místě. Je to jen datové struktury. A je-li to opravdu je datová struktura, aby to datová struktura.

Víte co? On má pravdu. Jak často se vám prostě balení soukromé pole v získání a nastavení, aniž by se skutečně dělat něco uvnitř get / set, prostě proto, že je „objektově orientované“ věc. To je řešení společnosti Microsoft do tohoto problému; jsou v podstatě veřejné pole, které se mohou vázat.

Odpovězeno 08/10/2008 v 12:21
zdroj uživatelem

hlasů
18

Jedna věc se zdá nikdo se zmínil, je to, jak auto-vlastnosti bohužel nejsou vhodné pro neměnných objektů (obvykle neměnné structs). Vzhledem k tomu, pro který si opravdu měli udělat:

private readonly string title;
public string Title
{
    get { return this.title; }
}

(Kde je pole inicializaci v konstruktoru pomocí předán parametru, a pak je pouze pro čtení.)

Tak to má výhody oproti prosté get/ private setautoproperty.

Odpovězeno 27/08/2008 v 19:04
zdroj uživatelem

hlasů
12

Vždycky jsem vytvořit vlastnosti namísto veřejných polí, protože můžete použít vlastnosti v definici rozhraní, nemůžete použít veřejné polí v definici rozhraní.

Odpovězeno 05/12/2008 v 11:59
zdroj uživatelem

hlasů
8

Auto-vlastnosti jsou stejně černé magie jako cokoliv jiného v jazyce C #. Poté, co si myslíte o tom, pokud jde o sestavování až IL spíše než být rozšířena na normální C # majetku první je to mnohem méně černou magii než spousta jiných jazykových konstruktů.

Odpovězeno 18/08/2008 v 01:27
zdroj uživatelem

hlasů
4

Myslím, že jakýkoliv konstrukt, který je intuitivní a snižuje řádků kódu je velké plus.

Tyto druhy funkcí je to, co dělá jazyky jako Ruby tak silný (tj a dynamické vlastnosti, které rovněž pomáhají snižovat přebytečný kód).

Ruby má to po celou dobu, jako jsou:

attr_accessor :my_property
attr_reader :my_getter
attr_writer :my_setter
Odpovězeno 13/08/2008 v 01:14
zdroj uživatelem

hlasů
4

I používat auto-reality po celou dobu. Předtím, než C # 3 jsem nemohl být obtěžovat se všemi psaní a slouží jen veřejné proměnné místo.

Jediné, co mi chybí je schopen to udělat:

public string Name = "DefaultName";

Budete muset přesunout výchozí do svých konstruktérů s vlastnostmi. únavné :-(

Odpovězeno 13/08/2008 v 00:22
zdroj uživatelem

hlasů
2

Je to jednoduché, je to krátké a pokud chcete vytvořit skutečné provádění uvnitř těla nemovitosti někde v řadě, bude to nezlomí externí rozhraní vašeho typu je.

Tak jednoduché, jak to.

Odpovězeno 07/09/2008 v 09:06
zdroj uživatelem

hlasů
2

Jediný problém mám s nimi je, že nejdou dostatečně daleko. Stejné verzi kompilátoru, že přidá automatické vlastnosti, přidá dílčí metody. Proč oni didnt dát ty dva dohromady, je mimo mě. Jednoduchý „částečný On <PropertyName> Změnil“ by dělali tyto věci opravdu užitečné.

Odpovězeno 13/08/2008 v 02:36
zdroj uživatelem

hlasů
1

Podle mého názoru, měli byste vždy použít automatické vlastnosti namísto veřejných polí. To znamená, že tady je kompromis:

Začněte s vnitřním poli pomocí konvence, kterou používáte pro vlastnost. Když poprvé buď

  • potřebují přístup k oblasti se nachází mimo jejich montáž, nebo
  • je třeba připojit logiku getrového / setra

Udělej to:

  1. přejmenování pole
  2. aby bylo soukromí
  3. přidat veřejný majetek

Váš klient kód nebude muset měnit.

Jednoho dne, když váš systém poroste a budete rozložit do samostatných sestav a různých řešení. Když se to stane, budou všechny vystavené pole vrátit do vás strašit, protože, jak Jeff zmíněno, změna veřejné pole na veřejném majetku je lámání změna API .

Odpovězeno 18/08/2008 v 00:19
zdroj uživatelem

hlasů
1

Jedna věc je zde poznamenat, že podle mého chápání, je to jen syntaktický cukr na konci C # 3.0, což znamená, že IL generovaný kompilátorem je stejný. Souhlasím s tím, o zamezení černou magii, ale všechny stejné, méně řádků pro stejnou věc je obvykle dobrá věc.

Odpovězeno 17/08/2008 v 23:40
zdroj uživatelem

hlasů
0

Můj největší remcání s automatickým vlastností je, že jsou navrženy tak, aby ušetřil čas, ale často jsem zjistil, že jsem se jim expandovat do plnohodnotné vlastnosti později.

Co VS2008 chybí je Explodovat Auto-Property refaktorovat.

Skutečnost, máme Encapsulate pole refaktorovat dělá tak, jak jsem pracovat rychleji, stačí použít veřejné pole.

Odpovězeno 05/12/2008 v 11:24
zdroj uživatelem

hlasů
0

@Domenic: Já to nechápu .. Nelze to provést pomocí automatických vlastnostmi ?:

public string Title { get; }

nebo

public string Title { get; private set; }

Je to to, co máte na mysli?

Odpovězeno 30/08/2008 v 12:59
zdroj uživatelem

hlasů
0

Studna s kousky kódu s automatickou vlastnost se stejným názvem bude sedm kláves celkem)

Odpovězeno 26/08/2008 v 10:01
zdroj uživatelem

hlasů
0

Používám CodeRush, je to rychlejší než auto-vlastnosti.

Udělat toto:

 private string title;
public string Title
{
    get { return title;  }
    set { title = value;  }
}

Vyžaduje osm úhozů celkem.

Odpovězeno 21/08/2008 v 12:13
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more