c# - sirve - que es set en programacion
C#winform: acceso a propiedades públicas desde otras formas y diferencia entre propiedades estáticas y públicas (5)
El frm1
no es tu objeto principal de formulario. Es un objeto creado recientemente donde la propiedad Test
inicializa cuando se carga (en el controlador de eventos Form1_Load
).
Estoy tratando de entender cuál es la diferencia entre una propiedad estática y pública. Pero cuando traté de acceder a mi propiedad pública ''Test'' en otra forma, dice ''nulo''.
Heres Form1:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private string _test;
public string Test
{
get { return _test; }
set { _test = value; }
}
private void Form1_Load(object sender, EventArgs e)
{
_test = "This is a test";
}
private void button1_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
frm2.Show();
}
}
Aquí está Form2:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
Form1 frm1 = new Form1();
label1.Text = frm1.Test;
}
}
Para verificar el valor de ''Test'' en Form1, coloco un punto de interrupción en esta línea:
label1.Text = frm1.Test;
Pero el valor es ''nulo''.
Por favor, ayúdenme, ¿cómo puedo acceder a propiedades públicas a otros formularios?
Y, por cierto, intenté hacer que esta propiedad pública fuera públicamente estática. Puedo acceder a esto usando esto:
Form1.Test
Pero noté que puedo cambiar el valor de "Prueba" de Form2, que no quiero que suceda. Es por eso que estoy tratando de usar propiedad pública pero sin suerte. ¿Alguien puede aclararme estas cosas? Gracias por toda su ayuda chicos!
EDIT: (For follow up question)
La respuesta de Sir John Koerner es la mejor respuesta para mi pregunta. Pero tengo una pregunta de seguimiento, traté de hacer que estas propiedades de ''prueba'' fueran ''estáticas'', y noté que incluso si hago de esta propiedad una propiedad estática o pública, todavía se puede editar en Form2. Para dejarme en claro aquí hay una muestra:
public partial class Form2 : Form
{
private Form1 f1;
public Form2(Form1 ParentForm)
{
InitializeComponent();
f1 = ParentForm;
}
private void Form2_Load(object sender, EventArgs e)
{
label1.Text = f1.Test;
}
private void button1_Click(object sender, EventArgs e)
{
f1.Test = "This test has been changed!";
this.Close();
}
}
Después de que se cerró Form2, intenté romper nuevamente en Form1_Load para verificar el valor de ''Test'' y ¡se modificó! ¿Cómo puedo hacer una propiedad pública en Form1 para leer solo en Form2 y no puedo editarla? Por favor, aclarame. ¡Muchas gracias chicos!
El uso de este método ''estático''
Al principio Propiedad de la etiqueta de control Modificadores = Público
en el código del programa a continuación
public static Form1 frm1 = new Form1();
public static Form2 frm2 = new Form2();
en el código Form1 a continuación
Program.frm2.show();
en el código de Form2 a continuación
label1.Text=Program.frm1.text;
La primera instancia de Form1
muestra una instancia de Form2
, y luego Form2
crea otra instancia de Form1
. Esto podría funcionar, pero configura _test
en el evento Form.Load
, que:
Ocurre antes de que se muestre un formulario por primera vez.
No muestra la instancia de Form1
que intenta leer Test
, por lo que su evento Load
no se producirá y Test
permanece null
.
Podría agregar una sobrecarga o propiedad de constructor para pasar la referencia de Form1 como menciona @JohnKoerner, pero preferiría solo pasar la variable requerida, quizás incluso encapsulada en un evento, para reducir el acoplamiento. Form2
generalmente no necesita saber todo sobre Form1
.
Su propiedad es una variable de instancia, por lo que el valor puede ser diferente en diferentes instancias de Form1
.
Si intenta acceder a variables de instancia desde un formulario principal, la forma más fácil de hacerlo es pasar Form1 en el constructor de Form2.
public partial class Form2 : Form
{
private Form1 f1;
public Form2(Form1 ParentForm)
{
InitializeComponent();
f1 = ParentForm;
}
private void Form2_Load(object sender, EventArgs e)
{
label1.Text = f1.Test;
}
}
Luego, cuando crea un nuevo Form2 desde Form1, puede hacer esto:
Form2 frm2 = new Form2(this);
Si desea que su propiedad sea de solo lectura, simplemente no puede especificar un colocador:
public string Test
{
get { return _test; }
}
público
Se puede acceder al tipo o miembro mediante cualquier otro código en el mismo conjunto u otro conjunto que lo haga referencia.
estático
El modificador estático de una clase significa que no se puede crear una instancia de la clase y que todos sus miembros son estáticos. Un miembro estático tiene una versión independientemente de cuántas instancias de su tipo adjunto se creen.
Una clase estática es básicamente la misma que una clase no estática, pero hay una diferencia: una clase estática no se puede instanciar externamente. En otras palabras, no puede usar la nueva palabra clave para crear una variable del tipo de clase. Como no hay una variable de instancia, puede acceder a los miembros de una clase estática utilizando el nombre de la clase en sí.
Sin embargo, existe algo así como un constructor estático. Cualquier clase puede tener uno de estos, incluidas las clases estáticas. No se pueden llamar directamente y no pueden tener parámetros (distintos de los parámetros de tipo en la clase). Se llama automáticamente a un constructor estático para inicializar la clase antes de que se cree la primera instancia o se haga referencia a cualquier miembro estático. Se ve como esto:
clase estática Foo () {static Foo () {Bar = "fubar"; }
public static string Bar { get; set; }
}
Las clases estáticas a menudo se usan como servicios, puede usarlas de la siguiente manera:
MyStaticClass.ServiceMethod (...);