2009-06-05 12 views
0

Ich habe eine Klasse namens ItemBase, von der eine Reihe von Klassen erben.Was ist der beste Weg, um semi-konstante Klassenvariablen in C# zu definieren?

In dieser Klasse habe ich eine Reihe von einzeiligen Methoden, die einfach einen String oder Objekt zurückgeben und sind zu allen Vererbungsklassen zur Verfügung. Ich benutze diese ziemlich oft in vererbten Klassen, um Code lesbarer zu machen und damit ich immer einen einzigen Ort habe, der jede Berechnung oder Information definiert.

Ich benutzte Getter, wie ich in PHP und Java tun, da dies der Weg ist, habe ich es immer getan:

public class ItemBase 
{ 
    protected string GetApplicationPath() 
    { 
     return System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase); 
    } 

    protected string GetApplicationDataPath() 
    { 
     return GetApplicationPath() + @"..\..\..\TestServices\"; 
    } 
} 

Allerdings habe ich bemerkt, dass Getter und Setter sind nicht wirklich verwendet in C# wie sie sind in Java oder PHP und und ich vermute, dass es eine bessere, prägnanter/Standard Weg, dies in C# zu tun.

Aber ich möchte nicht Klassenvariablen verwenden, da es nicht richtig scheint, Logik in der Variablenvariable a-Klasse zu definieren, nehme ich an, dass obwohl für einige Berechnungen möglich, es wahrscheinlich verpönt ist und Probleme verursacht in einigen Fällen:

protected string _applicationPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase); 

bleibe ich von öffentlichen Bereichen entfernt nach etwa Nachteile Lesen Sie mit ihnen die Straße hinunter in Jon Skeet's article. Plus das ist zu viel Code für nur eine einfache Definition.

protected string ApplicationPath 
{ 
    get 
    { 
     return System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase); 
    } 
} 

kann ich C# 's abgekürzt Eigenschaften verwenden, aber dann jedes kleines Stück Information hat Code an zwei Stellen und der Name zweimal verwendet wird, scheint nicht nur wie eine prägnante Lösung.

protected string ApplicationPath { get; set; } 

public ItemBase() 
{ 
    ApplicationPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase); 
} 

Also habe ich auf siedelten diese Getter mit genau wie ich in PHP und Java tun, obwohl dies eine sehr C# Weg zu sein scheint nicht, darüber zu gehen.

Welche Konventionen verwenden Sie in C# zum Speichern dieser "Ein-Zeilen-Klassenvariablen", die nur eine Information enthalten oder eine kleine Berechnung durchführen?

ANTWORT:

protected string ApplicationPath 
{ 
    get { return System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase); } 
} 

protected string ApplicationDataPath 
{ 
    get { return ApplicationPath + @"..\..\..\TestServices\"; } 
} 
+1

Wenn Sie einen "Property Get" -Stil dafür verwenden, sollten Sie es nicht "GetApplicationPath" nennen; nennen Sie es stattdessen "ApplicationPath". "Verb" -ähnliche Namen sind eher für einfache Methoden geeignet. Eine "Name" -ähnliche Konvention ist eher für Eigenschaften geeignet. –

+0

Danke, behoben. –

Antwort

3

„könnte ich C# 's abgekürzt Eigenschaften verwenden, aber dann jedes kleine Stück Information hat Code an zwei Stellen und der Name zweimal verwendet wird, scheint nicht nur wie eine prägnante Lösung“

Was tun Sie gemein damit? Eigenschaften sind nur syntaktischer Zucker für die Getter/Setter-Methoden, die Sie normalerweise in Java durchführen würden. Wo siehst du Code an zwei Stellen?

+0

Schauen Sie sich den Code unter der Aussage über abgekürzte Eigenschaften an (womit Edward automatisch implementierte Eigenschaften meint) - der Eigenschaftsname wird in der Eigenschaftsdeklaration und im Konstruktor verwendet. –

+0

Ja, aber von seiner Java-Getter-Methode scheint es nicht, dass er ein Hintergrundfeld verwendet, was zu der Annahme führt, dass er nie ein Bedürfnis hat, sie zu setzen. Also, warum sollte er die Auto-Eigenschaft überhaupt brauchen? – BFree

+0

ok Ich denke, ich verwirre Lese-Eigenschaften und öffentliche Felder. Das ist, was ich wissen wollte, also ist Ihr Beispiel eine schreibgeschützte Eigenschaft, es verwendet die C# Syntax Zucker, es ist eine Zeile, leicht zu lesen und sicher (im Sinne von Jon Skeets veränderbarem Strukturbeispiel). Das ist die Antwort: Einzeilige, schreibgeschützte Eigenschaften wie in Ihrem Beispiel sind der beste Weg, diese in C# zu implementieren. –

2

Welche Konventionen in C# tun Sie zum Speichern dieser „Klasse einzeiligen Variablen“ verwenden, die nur eine Information halten oder ein wenig Berechnung tun?

Nach Ihrer Beschreibung: Verwenden Sie schreibgeschützte Eigenschaften. Dies ist die Weise, es in C# zu tun, und in den meisten Fällen ist es wirklich die einzig sinnvolle Alternative.Wie Sie gesagt haben selbst:

Ich habe bemerkt, dass Getter und Setter sind nicht wirklich in C# verwendet, wie sie in Java oder PHP sind

Ja, und der Grund ist einfach:. Die Eigenschaften von NET bieten einen speziellen syntaktischen Zucker, um Getter und Setter auszudrücken. In gewisser Weise sind letztere nur ein Workaround, um die Abwesenheit des ersteren auszugleichen.

einige Fälle, wo Sie könnten nicht wollen Eigenschaften verwenden:

  • Compile-Zeitkonstanten, die nie sind garantiert, jemals ändern: öffentliche Konstanten verwenden (const) für diese:

    public const string Uuid = "D4D5DF8E-51DD-11DE-825A-1A5C55D89593"; 
    
  • Fälle, in denen Sie dem Verbraucher klar machen möchten, dass die Operation (möglicherweise) zeitraubend und/oder nicht frei von Nebenwirkungen ist: Verwenden Sie eine Get -vorfixed Methode. Im Fall von Nebenwirkungen wäre es jedoch wahrscheinlich besser, wenn der Methodenname dies auch widerspiegelt.

+0

Ich mag diese Regel: Verwenden Sie Eigenschaften, wenn keine Ressource verwendet wird und Getter, wenn es gibt. –

1

Die Antwort ist genau das gleiche wie eine der Optionen, die Sie bereits als zu viel Code diskontiert hatten? Abgesehen davon, dass diese Eigenschaftsnamen mit Get beginnen, ergibt das überhaupt keinen Sinn.

Eine geschützte Eigenschaft mit nur einer Get-Implementierung ist in der Tat der Weg zu gehen. Es sollte vom Compiler eingezeichnet werden, wenn sich jemand fragen würde.

+0

danke, ich habe es behoben. –

Verwandte Themen