¿Por qué la clase String no tiene un constructor sin parámetros?

int y object tienen un constructor sin parámetros. ¿Por qué no string ?

Actualizar:

Para proporcionar más información para usted.

No tienes un Constructor vacío con una string , pero sí tienes String.Empty . La razón es que una string es un objeto inmutable: cada instancia de una string que modifica en realidad está creando una nueva string en la memoria.

Por ejemplo: string name = ""; aunque es una string vacía, todavía tendrá alrededor de veinte bytes . Donde el string.Empty solo tendrá alrededor de cuatro u ocho bytes . Entonces, aunque significan lo mismo, uno es más eficiente que el otro.

Sin embargo, creo que desea que un Constructor vacío realice una manipulación que puede ser manejada más comúnmente por el StringBuilder . Aquí se puede encontrar un uso realmente agradable entre los dos (Determine el impacto / uso del rendimiento).

Aquí se puede encontrar información adicional sobre la string . Son inmutables por lo que los contenidos no pueden ser modificados posteriormente .

Ejemplo:

 string first = "Greg "; // Creates string "first" in memory. string last = "Arrigotti "; // Creates string "last" in memory. string name = first + last; // Creates string "name" in memory. 

Mientras edita uno de estos, simplemente está creando una nueva string en la memoria. Si está buscando una forma de manejar potencialmente los datos de usuario en un campo donde no existe un segundo nombre, por ejemplo, la cadena vacía puede contener un uso válido.

Esperemos que estos te orienten en la dirección correcta.

Porque no tiene sentido hacer eso.

string es inmutable. Crear una string vacía es simplemente inútil.

MSDN :

Las cadenas son inmutables: el contenido de un objeto de cadena no se puede cambiar después de crear el objeto, aunque la syntax hace que parezca que puedes hacerlo.

Como señaló Jonathan Lonowski, tenemos string.Empty . string.Empty para eso.

Las cadenas son inmutables, por lo tanto, la new String() no tiene ningún propósito. ¿Qué harías con eso?

Como se dijo antes, las cadenas son inmutables y, por lo tanto, si manipulas una cadena, en realidad creas una nueva cada vez.

Ejemplo:

 string s = "str"; // str was created in the memory. s += "2"; // str2 was created in the memory. 

Usa StringBuilder cuando quieras manipular una cadena (por eso querías un ctor vacío, ¿verdad?)

¿Por qué de hecho?

Sería completamente lógico y sensato proporcionar un constructor sin parámetros para el tipo de string , pero no tiene uno.

La razón es porque los diseñadores de ese tipo pensaron que sería una idea mucho mejor tener un string.Empty .

Podría haber una razón lógica para tener la capacidad de construir varias cadenas vacías que son instancias diferentes. No consigo ver uno en la parte superior de mi cabeza, pero eso no significa que alguien más no pueda ver uno.

Hay algunas razones técnicas detrás de por qué limitar el uso a la string.Empty puede ser una buena idea. En primer lugar, todas las cadenas vacías se consideran iguales, aunque no necesariamente las ReferenceEquals , por lo que tener múltiples cadenas vacías aparentemente no tendría sentido. La segunda vez que dices que “tengo estas dos cosas aparentemente similares, sin embargo, le he dado un significado diferente a cada una”, entonces tal vez estés tratando de resolver un problema con la herramienta incorrecta.

También hay algunos upshots de tener una string.Empty predefinida. string.Empty . Cada vez que hace referencia a él, hace referencia a la misma instancia de objeto que en cualquier otro lugar y, por lo tanto, no tiene muchos objetos de cadena vacíos (e idénticos) en la memoria.

¿Pero podría hacerse? Por supuesto.

Entonces, mientras todos aquí han tratado de justificar que no debería haber tal constructor, estoy diciendo que podría haber tal constructor.

Sin embargo, alguien decidió diseñar el tipo sin uno.

También hay una constante definida para esto: String.Empty

int es un tipo de valor, y como tal debe tener un constructor sin parámetros. No se puede hacer ninguna consideración aquí.

object no tiene ninguna razón para tener nada más que un constructor sin parámetros. No hay datos para darlo. ¿Qué parámetros esperas que tome? Los objetos construidos con un constructor sin parámetros también tienen un propósito; se utilizan, por ejemplo, como objetos para lock . Sin embargo, es una clase, por lo que no necesita tener un constructor público sin parámetros, sin embargo, dado que no necesita parámetros, es una cuestión de si desea que se construya una instancia del mismo; Microsoft optó por hacerlo concreto, en lugar de abstracto.

string es una clase, por lo que no es necesario tener un constructor sin parámetros. El equipo que lo construyó simplemente nunca vio la necesidad de tener uno. Uno podría usar sensiblemente un constructor de este tipo para crear una cadena vacía, pero eligen exponer string.Empty (así como un literal de cadena vacía) como una forma explícita de crear una cadena vacía. Esas opciones han mejorado la claridad sobre un constructor sin parámetros.

Otra ventaja bastante significativa de string.Empty y la cadena literal vacía es que son capaces de reutilizar la misma instancia de cadena. Dado que las cadenas son inmutables, la única forma de observar la diferencia entre dos referencias diferentes a cadenas vacías es mediante el uso de ReferenceEquals (o un lock en la instancia). Debido a que prácticamente nunca es necesario salir de su camino para tener diferentes referencias a una cadena vacía, eliminar el constructor sin parámetros elimina la posibilidad de un método equivalente pero de menor rendimiento para construir una cadena vacía. En el improbable caso de que sea importante construir una nueva instancia de cadena que sea una cadena vacía, se puede pasar una matriz de caracteres vacía a la sobrecarga del constructor relevante, por lo que eliminar el constructor sin parámetros no elimina ninguna funcionalidad del usuario final; simplemente te obliga a hacer un esfuerzo para hacer algo realmente inusual si quieres hacer algo realmente inusual, que es el signo del buen diseño del lenguaje.

Siempre que sepa que la cadena es inestimable, su pregunta puede reformularse de la siguiente manera:

¿Por qué demonios no puedo iniciar un objeto nulo?

responder:

Porque no hay ningún objeto nulo 🙂