Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
highlevel:csharp [2008/12/26 20:03] alfred |
highlevel:csharp [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 27: | Línea 27: | ||
| VariableChar = (char)VariableInt; | VariableChar = (char)VariableInt; | ||
| </code> | </code> | ||
| + | |||
| + | |||
| ==== Trabajar con strings ==== | ==== Trabajar con strings ==== | ||
| Si en medio de una cadena ponemos estos carácteres de escape.... | Si en medio de una cadena ponemos estos carácteres de escape.... | ||
| Línea 55: | Línea 57: | ||
| string b = System.String.Format("La variable a, es: {0}", a.ToString()); | string b = System.String.Format("La variable a, es: {0}", a.ToString()); | ||
| </code> | </code> | ||
| + | |||
| + | Otros Métodos: | ||
| + | * ''Replace'' Éste método recibe como parámetros dos strings, y devuelve uno. Lo que hace es coger el string con el que se ha llamado este método y se le pasa una cadena que es la que sustituirá por la segunda en todo el string y el nuevo estring ya sustituido es el que devuelve. | ||
| + | * ''Split'' Se le pasa un char o un vector de chars (por lo tanto irá entre comillas simples, no dobles), y devuelve un vector de strings. Lo que hace es coger el string donde se ha invocado a este método y corta (hacia la derecha) y el resultado lo guarda en un array de strings que será lo que devuelva. | ||
| + | |||
| + | |||
| Línea 106: | Línea 114: | ||
| Si un archivo fuese arrastrado con el mouse, desde windows al ejecutable habrá un argumento, éste será la ruta completa del archivo arrastrado. | Si un archivo fuese arrastrado con el mouse, desde windows al ejecutable habrá un argumento, éste será la ruta completa del archivo arrastrado. | ||
| - | ===== Programación Orientada a Objeto ===== | + | |
| + | ===== Programación Orientada a Objetos ===== | ||
| ==== Variables y métodos estáticos y constantes ==== | ==== Variables y métodos estáticos y constantes ==== | ||
| Una variable estática dentro de la aplicación es una variable de la que sólo habrá una copia. Es decir, si tenemos varios objetos de una clase y ésta una propiedad estática, esta propiedad será la misma para todos los objetos de esa clase. \\ | Una variable estática dentro de la aplicación es una variable de la que sólo habrá una copia. Es decir, si tenemos varios objetos de una clase y ésta una propiedad estática, esta propiedad será la misma para todos los objetos de esa clase. \\ | ||
| Línea 277: | Línea 287: | ||
| Puede ocurrir que la base clase tenga un método que nosotros queramos implementar, pero sta no esté implementada como virtual, para sustituir ese método por el nuevo sólo deberemos incluir el modificador new en la declaración de la función de la clase derivada: ''new public void Print() { ... }'' | Puede ocurrir que la base clase tenga un método que nosotros queramos implementar, pero sta no esté implementada como virtual, para sustituir ese método por el nuevo sólo deberemos incluir el modificador new en la declaración de la función de la clase derivada: ''new public void Print() { ... }'' | ||
| + | |||
| ==== Ámbito de una variable según su declaración ==== | ==== Ámbito de una variable según su declaración ==== | ||
| Línea 283: | Línea 294: | ||
| * **protected**: Visibles en la clase donde se definen y en las derivadas. | * **protected**: Visibles en la clase donde se definen y en las derivadas. | ||
| * **internal**: Sólo visibles dentro del archivo binario (compilado) donde se han declarado. | * **internal**: Sólo visibles dentro del archivo binario (compilado) donde se han declarado. | ||
| - | * **protected internal**: | + | * **protected internal**: Una clase pública podrá verse desde otro archivo, si no lo es no. |
| - | Una clase pública podrá verse desde otro archivo, si no lo es no. | + | |
| ==== Object en .NET ==== | ==== Object en .NET ==== | ||
| Línea 337: | Línea 347: | ||
| throw new ApplicationException(); | throw new ApplicationException(); | ||
| </code> | </code> | ||
| + | |||
| + | |||
| + | |||
| ==== Espacios de nombre (namespaces) ==== | ==== Espacios de nombre (namespaces) ==== | ||
| Línea 360: | Línea 373: | ||
| } | } | ||
| </code> | </code> | ||
| + | === Otros usos de using === | ||
| + | Podemos declarar un termino que englobe namespaces: | ||
| + | <code csharp> | ||
| + | using Terminal = System.Console; | ||
| + | ... | ||
| + | Terminal.WriteLine("Hola!"); | ||
| + | </code> | ||
| + | === using como instrucción === | ||
| + | Podemos usar el comando using para crear una variable por un corto perido de tiempo. Cuando hacemos: | ||
| + | <code csharp> | ||
| + | using (Form frm = new Form()) { | ||
| + | ... | ||
| + | } | ||
| + | </code> | ||
| + | Dentro podemos usar frm como una variable normal. Al salir de este se le llamará al método ''IDisposable''. | ||
| ==== Enumeraciones ==== | ==== Enumeraciones ==== | ||
| Línea 406: | Línea 434: | ||
| } | } | ||
| </code> | </code> | ||
| + | |||
| Línea 438: | Línea 467: | ||
| Para crear una propiedad debemos definir si aceptará get o set: ''int r { get; set; }'' \\ | Para crear una propiedad debemos definir si aceptará get o set: ''int r { get; set; }'' \\ | ||
| Una interface puede heredar de varias interfaces. | Una interface puede heredar de varias interfaces. | ||
| + | ==== Dispose y Destructores ==== | ||
| + | |||
| + | === Interfaz IDispose === | ||
| + | Al crear una clase que implemente esta interfaz se le añadirá el método "Dispose", éste método es llamado cuando el recolector de basura elimina el objeto y, por lo tanto, este método debería de eliminar de memoria otros objetos que este contenga. | ||
| + | |||
| + | === Método Dispose === | ||
| + | Un método Dispose ha de eliminar todos los objetos que tiene, llamando así, a su vez a sus métodos Dispose. Es importante que un método Dispose pueda ser llamado varias veces sin que provoque ningua excepción. Al llevar un parámetro bool, éste nos sirve para indicar si ha sido llamado por el sistema o por nosotros. | ||
| + | |||
| + | === Destructores === | ||
| + | En .NET si quisiesemos que el recolector de basura hiciese algo justo al eliminar un objeto, deberíamos sobreescribir en este el método Finalize, excepto en C# que tiene su propia sintaxis de destructor. El uso indebido de estos destructores puede ser perjudicial para el programa, ya que el recolector de basura va sondeando los objetos para eliminarlos y si cuando se van a eliminar aun no se ha lanzado el método finalize lo pone en una cola de objetos que lo han de llamar, por lo que el objeto estaría más tiempo rondando en memoria. \\ | ||
| + | El método Finalize debería ser protected, no deberíamos de dar acceso a él a código de fuera de la clase donde esté, y debería usarse como última instancia, ya que es preferible. \\ | ||
| + | En C# no podemos llamar a Finalize, pero sí crear un destructor así: | ||
| + | <code csharp> | ||
| + | ~nombreClase { ... } | ||
| + | </code> | ||
| ===== Conceptos del lenguaje ===== | ===== Conceptos del lenguaje ===== | ||
| Línea 481: | Línea 525: | ||
| ==== Operador as ==== | ==== Operador as ==== | ||
| Es un molde para la conversión de tipos, pero si existe un error en la conversión, proporciona el valor null en vez de producir una excepción. Más formalmente, una expresión de la forma: ''expression as type'', que equivale a: ''expression is type ? (type)expression : (type)null'' | Es un molde para la conversión de tipos, pero si existe un error en la conversión, proporciona el valor null en vez de producir una excepción. Más formalmente, una expresión de la forma: ''expression as type'', que equivale a: ''expression is type ? (type)expression : (type)null'' | ||
| + | |||
| Línea 525: | Línea 570: | ||
| El c: Hola C. Adios C. | El c: Hola C. Adios C. | ||
| El d: Adios D. | El d: Adios D. | ||
| - | <//code> | + | </code> |
| ==== Añadir un nuevo evento a una clase ==== | ==== Añadir un nuevo evento a una clase ==== | ||
| Línea 536: | Línea 582: | ||
| public void Ejecuta() { | public void Ejecuta() { | ||
| for (int i = 0; i <= 100; i++) { | for (int i = 0; i <= 100; i++) { | ||
| - | DarNumero(this, i); | + | if (DarNumero != null) |
| + | DarNumero(this, i); | ||
| } | } | ||
| } | } | ||
| Línea 674: | Línea 721: | ||
| De esta forma, aunque la variable puntero no exista, Array no será movida. \\ | De esta forma, aunque la variable puntero no exista, Array no será movida. \\ | ||
| Podemos saber el tamaño de una variable con el operador ''sizeof(<tipo>)''. | Podemos saber el tamaño de una variable con el operador ''sizeof(<tipo>)''. | ||
| + | |||
| + | |||
| ===== Notas ===== | ===== Notas ===== | ||
| + | * Una nueva línea al escribir texto se consigue con: ''Environment.NewLine'' | ||
| + | |||
| + | ==== Tips ==== | ||
| + | * Crear un objeto de un solo uso: ''new Thread(new ThreadStart(Thread2)).Start();'' | ||
| + | * Asignar a un bool una expresión: ''bool bPar = (iNum % 2 == 0);'' | ||
| + | * Definir dos objetos del mismo tipo: ''Image tal = image.fromfile("asjdf"), tal2 = image.fromfile("sakfjdl");'' | ||