2011-01-11 20 views
30

Estas son declaraciones para una clase Person.C# Get/Set Sintaxis Uso

protected int ID { get; set; } 
protected string Title { get; set; } 
protected string Description { get; set; } 
protected TimeSpan jobLength { get; set; } 

¿Cómo hago con el uso de get/set? En principal, instanciar un

Person Tom = new Person(); 

¿Cómo funciona Tom.set/get ??

Estoy acostumbrado a hacer el estilo C++ donde acaba de escribir las funciones int getAge() y void setAge(). Pero en C# hay atajos manejando get y set?

+1

No se puede acceder a las propiedades de fuera de la clase de la persona (y las clases derivadas) si se declaran como protegidos ... –

+1

posible duplicado de [¿Qué significa esto? Nombre público {obtener; establecer;}] (http://stackoverflow.com/questions/1310223/what-does-this-mean-public-name-get-set) – nawfal

Respuesta

69

Asumiendo que tiene acceso a ellos (las propiedades que se han declarado son protected), que ellos utilizan como esto:

Person tom = new Person(); 
tom.Title = "A title"; 
string hisTitle = tom.Title; 

Estos son properties. Básicamente son pares de métodos getter/setter (aunque puedes tener solo un getter, o simplemente un setter) con los metadatos apropiados. El ejemplo que ha dado es de propiedades implementadas automáticamente donde el compilador agrega un campo de respaldo. Aunque puedes escribir el código tú mismo. Por ejemplo, la propiedad Title que ha declarado es así:

private string title; // Backing field 
protected string Title 
{ 
    get { return title; } // Getter 
    set { title = value; } // Setter 
} 

... excepto que el campo respaldo se le da un "nombre inefable" - uno que no se puede hacer referencia a en su código C#. Estás obligado a pasar por la propiedad en sí.

Puede hacer que una parte de una propiedad sea más restringida que otra. Por ejemplo, esto es bastante común:

private string foo; 
public string Foo 
{ 
    get { return foo; } 
    private set { foo = value; } 
} 

o como una propiedad implementado de forma automática:

public string Foo { get; private set; } 

Aquí el "getter" es público pero el "colocador" es privado.

+2

Sí, pero están declarados protegidos, por lo que no puede hacer eso ... –

+1

@Thomas: Dependiendo de la clase en la que estemos ... editaremos sin embargo. –

+5

+1 para "excepto que el campo de respaldo recibe un 'nombre indescriptible'". Muy Lovecraftian. –

2

Estos son properties. Se podría usarlos de esta manera:

Tom.Title = "Accountant"; 
string desc = Tom.Description; 

Pero teniendo en cuenta que se declaran protected su visibilidad puede ser una preocupación.

+0

No puede hacer eso en propiedades protegidas desde fuera del código de clase de persona. – Nickolodeon

+0

Piensa en las clases derivadas. Allí debería ser posible. ;-) – Offler

0

Póngalos en público. Es decir, donde sea que tenga la palabra "protegida", cámbiela por la palabra "público". Si necesita control de acceso, póngalo dentro, delante de la palabra 'obtener' o la palabra 'establecer'.

0

No son capaces de acceder a esas propiedades, ya que están marcados como protected significado:

El tipo o miembro sólo se puede acceder con el código de la misma clase o estructura, o en una clase que se deriva de esa clase.

1

Por cierto, en C# 3.5 Pueden crearse instancias de las propiedades de su objeto, así:

Person TOM=new Person 
{ 
    title = "My title", ID = 1 
}; 

Pero, de nuevo, las propiedades deben ser públicos.

+0

Te refieres a C# 3 o C# 3.0. Hay .NET 3.5, pero no C# 3.5. –

+0

Quise decir .NET 3.5 – Nickolodeon

2

suponiendo que tiene una clase de canción (se puede hacer referencia más adelante), la puesta en práctica tradicional sería de la siguiente manera

class Song 
    { 
     private String author_name; 
     public String setauthorname(String X) {}; //implementation goes here 
     public String getauthorname() {}; //implementation goes here 
    } 

Ahora, considere esto implementación de la clase.

 class Song 
     { 
      private String author_name; 
      public String Author_Name 
      { 
       get { return author_name; } 
       set { author_name= value; } 
      } 
     } 

En la clase de su 'principal', que se escribió el código como

class TestSong 
    { 
     public static void Main(String[] Args) 
     { 
      Song _song = new Song(); //create an object for class 'Song'  
      _song.Author_Name = 'John Biley'; 
      String author = _song.Author_Name;   
      Console.WriteLine("Authorname = {0}"+author); 
     } 
    } 

punto a destacar;

El método que establezca/obtenga debe ser público o estar protegido (tenga cuidado) pero estrictamente no debe ser privado.

0

No entiendo lo que esto no está clara

Las propiedades son los miembros que proporcionan un mecanismo flexible para leer, escribir o calcular los valores de los campos privados. Las propiedades se pueden usar como si fueran miembros de datos públicos, pero en realidad son métodos especiales llamados accesadores. Esto permite acceder fácilmente a los datos sin dejar de ofrecer la seguridad y flexibilidad de los métodos.

En este ejemplo, la clase TimePeriod almacena un período de tiempo. Internamente, la clase almacena el tiempo en segundos, pero se proporciona una propiedad llamada Horas que permite a un cliente especificar un tiempo en horas. Los accessors para la propiedad Hours realizan la conversión entre horas y segundos.

Ejemplo

class TimePeriod 
{ 
    private double seconds; 

    public double Hours 
    { 
     get { return seconds/3600; } 
     set { seconds = value * 3600; } 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     TimePeriod t = new TimePeriod(); 

     // Assigning the Hours property causes the 'set' accessor to be called. 
     t.Hours = 24; 

     // Evaluating the Hours property causes the 'get' accessor to be called. 
     System.Console.WriteLine("Time in hours: " + t.Hours); 
    } 
} 

general de las propiedades

propiedades permiten una clase para exponer de manera pública de obtener y establecer valores, al tiempo que oculta la implementación o el código de verificación.

Un obtener propiedad de acceso se utiliza para devolver el valor de la propiedad, y una conjunto de acceso se utiliza para asignar un nuevo valor. Estos accesadores pueden tener diferentes niveles de acceso.

La palabra clave value se utiliza para definir el valor asignado por el indexador establecido.

Las propiedades que no implementan un método set son de solo lectura.

http://msdn.microsoft.com/en-US/library/x9fsa0sw%28v=vs.80%29.aspx