una sirve que propiedades propiedad programacion para metodos herencia entre diferencia clases clase campo agregar c# properties default partial-classes

c# - sirve - que es public en programacion



C#: ¿Cómo establecer el valor predeterminado para una propiedad en una clase parcial? (8)

Soy muy nuevo en C # así que por favor tengan paciencia conmigo ...

Estoy implementando una clase parcial, y me gustaría agregar dos propiedades como esta:

public partial class SomeModel { public bool IsSomething { get; set; } public List<string> SomeList { get; set; } ... Additional methods using the above data members ... }

Me gustaría inicializar ambos miembros de datos: IsSomething a True y SomeList a new List<string>() . Normalmente lo haría en un constructor, sin embargo, como es una clase parcial, no quiero tocar el constructor (¿debería?).

¿Cuál es la mejor manera de lograr esto?

Gracias

PD. Estoy trabajando en ASP.NET MVC, agregando funcionalidad a un cierto modelo, de ahí la clase parcial.


Ambas propiedades ya tendrán los valores predeterminados que necesita.

No hay nada de malo en tener un constructor en una clase parcial. Las clases parciales no son de ninguna manera especiales, aparte del hecho de que su código fuente está distribuido en múltiples archivos / declaraciones.


La primera propiedad (IsSomething) es un booleano. Será falso por defecto.

La segunda propiedad, dado que es un tipo de referencia, se convertirá en nulo por defecto sin ningún esfuerzo de su parte. No necesita tocar el constructor, ya que los tipos de referencia (clases) comenzarán automáticamente como null en .NET.

Si quisiera usar un valor no predeterminado, tendría dos opciones:

Primero, use un campo de almacenamiento de respaldo:

private bool isSomething = true; public bool IsSomething { get { return this.isSomething; } set { this.isSomething = value; } }

Segunda opción: agréguelo al constructor.

Tenga en cuenta que la primera opción no tiene gastos adicionales, básicamente es lo que hace el compilador cuando utiliza una propiedad automática.


No puede tener dos constructores en dos partes de una clase parcial. Sin embargo, puede usar métodos parciales para lograr algo como esto:

// file1: partial void Initialize(); public Constructor() { // ... stuff ... initialize part 1 Initialize(); } // file2: void Initalize() { // ... further initializations part 2 might want to do }

Si ninguna parte de una clase parcial define el método parcial, se omitirán todas las llamadas.


Para esto, no use propiedad automática, pero de la manera antigua

YourType _yourParameter = yourDefaultValue; public YourType YourParameter { get{return _yourParameter;} set{_yourParameter=value;} }


ADVERTENCIA para usuarios de clases parciales WCF

Si intenta agregar una propiedad a una clase de proxy WCF (generada por Agregar referencia de servicio), es posible que se sorprenda al descubrir que los campos privados no se inicializan porque aparentemente no se llama a ningún constructor .

Si intenta hacer esto (como se sugiere en otras respuestas), nunca se llamará:

private bool _sendEmail = true;

Esto no tiene nada que ver con si el campo está en una clase parcial o no.

Lo que tiene que hacer es agregar un atributo [OnDeserialized] que le permita realizar una inicialización adicional del objeto. Esto es parte de System.Runtime.Serialization, por lo que solo es útil en el contexto de la serialización cuando se usa DataContractSerializer .

public partial class EndOfDayPackageInfo { [OnDeserialized()] public void Init(StreamingContext context) { _sendEmail = true; } private bool _sendEmail; public bool SendEmail { get { return _sendEmail; } set { _sendEmail = value; RaisePropertyChanged("SendEmail"); } }

}

Otro enfoque es ''cargar la carga'' la propiedad, pero este enfoque es mucho menos elegante.

private bool _sendEmail; private bool _sendEmailInitialized; public bool SendEmail { get { if (!_sendEmailInitialized) { _sendEmailInitialized = true; _sendEmail = true; // default value } return _sendEmail; } set { if (!_sendEmailInitialized) { // prevent unwanted initialization if ''set'' is called before ''get'' _sendEmailInitialized = true; } _sendEmail = value; RaisePropertyChanged("SendEmail"); } }


Para el usuario de la versión 6.0 de C #, es posible inicializar las propiedades de esta manera:

public bool IsSomething { get; set; } = true; public List<string> SomeList { get; set; } = new List<string>();


Actualizado para C # 6

C # 6 ha agregado la capacidad de asignar un valor predeterminado a las propiedades automáticas. El valor puede ser cualquier expresión (no tiene que ser una constante). Aquí hay algunos ejemplos:

// Initialize to a string literal public string SomeProperty {get;set;} = "This is the default value"; // Initialize with a simple expression public DateTime ConstructedAt {get;} = DateTime.Now; // Initialize with a conditional expression public bool IsFoo { get; } = SomeClass.SomeProperty ? true : false;

Respuesta original

Las propiedades implementadas automáticamente se pueden inicializar en el constructor de la clase, pero no en la propia propiedad.

public SomeModel { IsSomething = false; SomeList = new List<string>(); }

... o puede usar una propiedad con respaldo de campo (un poco más de trabajo) e inicializar el campo en sí ...

private bool _IsSomething = false; public bool IsSomething { get { return _IsSomething; } set { _IsSomething = value; } }

Actualización: mi respuesta anterior no aclara la cuestión de que esto se encuentre en una clase parcial. La respuesta de Mehrdad ofrece la solución de usar un método parcial, que está en línea con mi primera sugerencia. Mi segunda sugerencia de usar propiedades no implementadas automáticamente (propiedades implementadas manualmente?) Funcionará para esta situación.


private bool _InternalUserContactUpdate = false; public bool InternalUserContactUpdate { get { return _InternalUserContactUpdate; } set { _InternalUserContactUpdate = value; } }

Luego, cuando desee anular el valor con la condición,

if(!objUserModel.FirstName.ToLower().Equals(entry.Key[0].Attributes.Contains("firstname").ToString().ToLower())) { objUserModel.InternalUserContactUpdate= true; }

Espero que esto ayude