Si sabes programar en Python, este documento puede servirte para saber cómo hacer en C# las cosas que ya sabes hacer. No es una referencia completa, sólo incluimos algunos aspectos de los lenguajes.
C# es un lenguaje compilado a lenguaje intermedio con tipos de datos estáticos.
Python es un lenguaje interpretado con tipos de datos dinámicos.
El ciclo habitual de desarrollo en C# implica editar uno o más archivos de código fuente, compilar los archivos de texto para producir un archivo binario en lenguaje intermedio, y ejecutar ese archivo binario en el entorno en tiempo de ejecución.
El ciclo habitual de desarrollo en Python implica ingresar una o más expresiones en un evaluador, que evalúa la expresión e imprime el resultado. También es posible desarrollar en Python editando uno o más archivos de código fuente, y ejecutar esos archivos con el intérprete de Python.
Los bloques de código en Python se definen mediante sangría en el código fuente, mientras que en C# se utiliza { al comienzo de un bloque y } al final.
Mientras es posible tener código Python en funciones o en métodos que pueden ser usados en expresiones, en C# el código sólo está en los métodos; no hay funciones “libres”. Algo análogo ocurre con las variables: mientras en Python puedo declarar variables globales, en C# las variables sólo pueden ser declaradas en las instancias de las clases, o en las propias clases; esto último equivale a las variables de instancia y de clase, respectivamente, que existen en Python.
Otras correspondencias o diferencias puedes encontrarlas en la tabla a continuación.
Python | C# |
---|---|
Comentarios en línea: # | Comentarios en línea: // 1 |
Comentarios en múltiples líneas comienzan y terminan con """ | Comentarios en múltiples líneas comienzan con /* y terminan con */ |
if…, if…else, if…elif | if…, if…else, switch…case…default |
for i in range(0, 3)… | for (int i = 0; i <=3; i++)…, foreach… 2 |
while (i < 3)… | while (i < 3)… |
and, or, not | & y &&3,| y |3|, ! |
<, <=, >, >=, ==, != | <, <=, >, >=, ==4, != |
+, -, *, /, +=, -=, *=, /= | +, -, *, /, +=, -=, *=, /=5 |
bool | bool, Boolean6 |
float | float, Single7 |
int | int, Int328 |
str | string, String9 |
Asignar el valor y a la variable x: x = y | Asignar el valor x a la variable y del tipo T: T x = y10 |
Crear una instancia de una clase C y asignarla a la variable x: x = C() | Crear una instancia de una clase C y asignarla a la variable x: C x = new C(); |
float(…) | Convert.ToSingle(…), Single.Parse(…)11 |
int(…) | Convert.ToInt32(…), Int32.Parse(…)11 |
str(…) | Int32.ToString(…), Single.ToString(…)11 |
Cuando demo es una variable que contiene una instancia de string, demo[0]referencia el primer carácter, demo[-1] el último, demo[2:4] referencia una porción del segundo al cuarto carácter, y demo[:4] una porción del primero al cuarto carácter | Cuando demo es una variable que contiene una instancia de String, demo[0] referencia el primer carácter, demo[^0] el último, demo[1..4] referencia una porción del segundo al cuarto carácter, y demo[..4] una porción del primero al cuarto carácter.1213 |
def… | No hay un solo equivalente en C#; para los métodos la sintaxis depende de la visibilidad, si retorna un resultado o no, el tipo de datos del resultado, y otros factores. |
class… | class… |
self | this14 |
@classmethod | static |
cls | El nombre de la clase |
pass | Un bloque vacío {} o un ; puede ser similar en algunos casos, pero no existe una equivalencia exacta |
raise… | throw… |
with… | using…15 es similar, pero no existe una equivalencia exacta |
print(…) | Console.WriteLine(…) |
input() | Console.ReadLine()16 |
assert… | Debug.Assert(…) es similar, pero se trata de una invocación y no de una palabra clave |
yield | La palabra clave yield, existe en C#, pero no tiene exactamente el mismo uso que en Python |
import | No hay un equivalente exacto en C# porque los ensamblados -análogos a los módulos o paquetes en Python- sólo pueden ser cargados dinámicamente mediante una API, a diferencia de Python que siempre son cargados dinámicamente. using es una directiva en C# que permite referenciar tipos en un espacio de nombres sin calificarlos. |
list = [1,2,3] | List<int> list = new List<int>([1, 2, 3])17 |
list[0] | list[0] |
list.append(4) | list.Add(4) |
4 in list | list.Contains(4) |
list.remove(4) | list.Remove(4) |
print(list) | Console.WriteLine(String.Join(", ", list.ToArray())); |
dict = {"Uno": 1x,"Dos": 2,"Tres": 3} | Dictionary<string, int> dict = new Dictionary<string, int>() { {"Uno", 1}, {"Dos", 2}, {"Tres", 3}} |
dict[0] | dict[0] |
dict["Cuatro"] = 4 | dict.Add("Cuatro", 4) |
"Uno" in dict | dict.Keys.Contains("Uno") |
dict.pop("Cuatro") | dict.Remove("Cuatro") |
print(dict) | Console.WriteLine(String.Join(", ", dict.Select(k => k.Key + ": " + k.Value))) |
En un programa de consola en C# el punto de entrada, esto es, lo primero que se ejecuta cuando se corre el programa, típicamente es un método de clase declarada como static void Main(string[] args) o static void Main(). Ver https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/main-and-command-args/
_1 Los comentarios en línea que comienzan con tres /// tienen un significado especial para generar documentación externa. Ver: https://docs.microsoft.com/en-us/dotnet/csharp/codedoc
_2 La cláusula foreach en C# es similar a la cláusula for en Python cuando se usa con iterables.
_3 La diferencia es si se evalúa el segundo operando. Ver https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/boolean-logical-operators#logical-and-operator- y https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/boolean-logical-operators#conditional-logical-and-operator-
_4 En C# el operador == compara si dos objetos son el mismo; excepto para las instancias de la clase String, donde compara el valor. El operador == puede ser sobrescrito.
_5 Mientras /= aplicado a objetos de tipo int en Python da como resultado un objeto de tipo float, en C# da un objeto de tipo int siempre.Ver https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/division-operator.
_6 En C# la palabra clave bool es un alias para el tipo System.Boolean.
_7 En C# la palabra clave float es un alias para el tipo System.Single.
_8 En C# la palabra clave int es un alias para el tipo System.Int32.
_9 En C# la palabra clave string es un alias para el tipo System.String.
_10 Aquí se muestra la declaración de la variable x del tipo T y la asignación del valor y a la variable x en la misma sentencia; es equivalente a T x; y luego x = y;. Vean que en Python no se declara el tipo de la variable, mientras en C# sí. La variable x es del tipo de y en Python, no es que no tenga tipo. Algo similar ocurre en C# al usar la palabra clave var al declarar una variable: var x = y; es equivalente a T x = y; si T es el tipo de y.
_11 Mientras float(), int() y str() son cast -conversión de tipos- en Python, los mostrados como correspondientes en C# son métodos; el concepto de cast existe en C# pero no se usa aquí como en Python.
_12 Ver más del manejo de índices con C#: https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/ranges-indexes.
_13 Solamente válido con netCore 3.x o superior y C# 8.0 o superior https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8.
_14 La primera variable de un método en Python referencia al objeto que recibe el mensaje que ocasiona la ejecución de ese método, y suele llamarse self. En C# esa referencia se obtiene mediante la palabra clave this, y no es un parámetro del método
_15 En C# using es tanto una directiva para importar un módulo como una sentencia para asegurar la ejecución de destructores.
_16 Mientras input en Python permite mostrar un mensaje además de leer un valor, Console.ReadLine()
en C# sólo lee un valor; para mostrar un mensaje, puedes usar Console.Write()
o Console.WriteLine()
.
_17 La clase ArrayList
de C# puede contener objetos de cualquier tipo al igual que las listas de Python, sin embargo, puede ser preferible usar List<T>
donde T
es un nombre de clase, para tener listas que contengan objetos sólo del tipo T
. Los ejemplos que siguen son iguales para ArrayList
y para List<T>
. Para usar List<T>
es necesario incluir el espacio de nombres System.Collections.Generic
.