Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original.
Traducción
Original
Este tema aún no ha recibido ninguna valoración - Valorar este tema

StringBuilder (Clase)

Representa una cadena de caracteres modificable. Esta clase no puede heredarse.

System.Object
  System.Text.StringBuilder

Espacio de nombres:  System.Text
Ensamblado:  mscorlib (en mscorlib.dll)
[SerializableAttribute]
[ComVisibleAttribute(true)]
public sealed class StringBuilder : ISerializable

El tipo StringBuilder expone los siguientes miembros.

  Nombre Descripción
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif StringBuilder() Inicializa una nueva instancia de la clase StringBuilder.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif StringBuilder(Int32) Inicializa una nueva instancia de la clase StringBuilder con la capacidad especificada.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif StringBuilder(String) Inicializa una nueva instancia de la clase StringBuilder con la cadena especificada.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif StringBuilder(Int32, Int32) Inicializa una nueva instancia de la clase StringBuilder que empieza con una capacidad concreta y puede aumentar hasta un máximo especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif StringBuilder(String, Int32) Inicializa una nueva instancia de la clase StringBuilder con la cadena y capacidad especificadas.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif StringBuilder(String, Int32, Int32, Int32) Inicializa una nueva instancia de la clase StringBuilder a partir de la subcadena y capacidad especificadas.
Arriba
  Nombre Descripción
Propiedad pública Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Capacity Obtiene o establece el número máximo de caracteres que puede contener la memoria asignada por la instancia en uso.
Propiedad pública Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Chars Obtiene o establece el carácter en la posición de carácter especificada en la instancia.
Propiedad pública Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Length Obtiene o establece la longitud del objeto StringBuilder actual.
Propiedad pública MaxCapacity Obtiene la capacidad máxima de la instancia.
Arriba
  Nombre Descripción
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Append(Boolean) Anexa a esta instancia la representación en forma de cadena de un valor booleano especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Append(Byte) Anexa a esta instancia la representación en forma de cadena de un entero sin signo de 8 bits especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Append(Char) Anexa a esta instancia la representación en forma de cadena de un carácter Unicode especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Append(Char[]) Anexa a esta instancia la representación en forma de cadena de los caracteres Unicode de una matriz especificada.
Método público Append(Decimal) Anexa a esta instancia la representación en forma de cadena de un número decimal especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Append(Double) Anexa a esta instancia la representación en forma de cadena de un número de punto flotante de precisión doble especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Append(Int16) Anexa a esta instancia la representación en forma de cadena de un entero con signo de 16 bits especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Append(Int32) Anexa a esta instancia la representación en forma de cadena de un entero con signo de 32 bits especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Append(Int64) Anexa a esta instancia la representación en forma de cadena de un entero con signo de 64 bits especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Append(Object) Anexa a esta instancia la representación en forma de cadena de un objeto especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Append(SByte) Anexa a esta instancia la representación en forma de cadena de un entero con signo de 8 bits especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Append(Single) Anexa a esta instancia la representación en forma de cadena de un número de punto flotante de precisión sencilla especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Append(String) Anexa a esta instancia una copia de la cadena especificada.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Append(UInt16) Anexa a esta instancia la representación en forma de cadena de un entero sin signo de 16 bits especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Append(UInt32) Anexa a esta instancia la representación en forma de cadena de un entero sin signo de 32 bits especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Append(UInt64) Anexa a esta instancia la representación en forma de cadena de un entero sin signo de 64 bits especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Append(Char, Int32) Anexa a esta instancia un número especificado de copias de la representación en forma de cadena de un carácter Unicode.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Append(Char[], Int32, Int32) Anexa a esta instancia la representación en forma de cadena de una submatriz de caracteres Unicode especificados.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Append(String, Int32, Int32) Anexa a esta instancia una copia de una subcadena especificada.
Método público AppendFormat(String, Object) Anexa a esta instancia la cadena devuelta al procesar una cadena de formato compuesta que contiene cero o más elementos de formato. Cada elemento de formato se reemplaza por la representación en forma de cadena de un único argumento.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif AppendFormat(String, Object[]) Anexa a esta instancia la cadena devuelta al procesar una cadena de formato compuesta que contiene cero o más elementos de formato. Cada elemento de formato se reemplaza por la representación en forma de cadena de un argumento correspondiente en una matriz de parámetros.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif AppendFormat(IFormatProvider, String, Object[]) Anexa a esta instancia la cadena devuelta al procesar una cadena de formato compuesta que contiene cero o más elementos de formato. Cada elemento de formato se reemplaza por la representación en forma de cadena de un argumento correspondiente en una matriz de parámetros utilizando un proveedor de formato especificado.
Método público AppendFormat(String, Object, Object) Anexa a esta instancia la cadena devuelta al procesar una cadena de formato compuesta que contiene cero o más elementos de formato. Cada elemento de formato se reemplaza por la representación en forma de cadena de uno de dos argumentos.
Método público AppendFormat(String, Object, Object, Object) Anexa a esta instancia la cadena devuelta al procesar una cadena de formato compuesta que contiene cero o más elementos de formato. Cada elemento de formato se reemplaza por la representación en forma de cadena de uno de tres argumentos.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif AppendLine() Anexa el terminador de línea predeterminado al final del objeto StringBuilder actual.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif AppendLine(String) Anexa una copia de la cadena especificada seguida del terminador de línea predeterminado al final del objeto StringBuilder actual.
Método público Clear Quita todos los caracteres de la instancia de StringBuilder actual.
Método público CopyTo Copia los caracteres de un segmento especificado de esta instancia al segmento especificado de una matriz Char de destino.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif EnsureCapacity Garantiza que la capacidad de la instancia de StringBuilder corresponde como mínimo al valor especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Equals(Object) Determina si el objeto Object especificado es igual al objeto Object actual. (Se hereda de Object).
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Equals(StringBuilder) Devuelve un valor que indica si esta instancia equivale a un objeto especificado.
Método protegido Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Finalize Permite que un objeto intente liberar recursos y realizar otras operaciones de limpieza antes de ser reclamado por la recolección de elementos no utilizados. (Se hereda de Object).
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif GetHashCode Actúa como función hash para un tipo concreto. (Se hereda de Object).
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif GetType Obtiene el objeto Type de la instancia actual. (Se hereda de Object).
Método público Insert(Int32, Boolean) Inserta en la instancia la representación en forma de cadena de un valor booleano en la posición del carácter que se haya especificado.
Método público Insert(Int32, Byte) Inserta en la instancia la representación en forma de cadena de un entero de 8 bits sin signo, en la posición del carácter que se haya especificado.
Método público Insert(Int32, Char) Inserta en la instancia la representación en forma de cadena de un carácter Unicode concreto en la posición del carácter que se haya especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Insert(Int32, Char[]) Inserta en la instancia la representación en forma de cadena de una matriz concreta de caracteres Unicode en la posición del carácter que se haya especificado.
Método público Insert(Int32, Decimal) Inserta en la instancia la representación en forma de cadena de un número decimal en la posición del carácter que se haya especificado.
Método público Insert(Int32, Double) Inserta en la instancia la representación en forma de cadena de un número de punto flotante de doble precisión en la posición del carácter que se haya especificado.
Método público Insert(Int32, Int16) Inserta en esta instancia la representación en forma de cadena de un entero de 16 bits con signo especificado, en la posición del carácter que se haya indicado.
Método público Insert(Int32, Int32) Inserta en esta instancia la representación en forma de cadena de un entero de 32 bits con signo especificado, en la posición del carácter que se haya indicado.
Método público Insert(Int32, Int64) Inserta en la instancia la representación en forma de cadena de un entero de 64 bits con signo, en la posición del carácter que se haya especificado.
Método público Insert(Int32, Object) Inserta en la instancia la representación en forma de cadena de un objeto en la posición del carácter que se haya especificado.
Método público Insert(Int32, SByte) Inserta en esta instancia la representación en forma de cadena de un entero de 8 bits con signo especificado, en la posición del carácter que se haya indicado.
Método público Insert(Int32, Single) Inserta en la instancia la representación en forma de cadena de un número de punto flotante de precisión sencilla en la posición del carácter que se haya especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Insert(Int32, String) Inserta una cadena en la instancia en la posición del carácter que se haya especificado.
Método público Insert(Int32, UInt16) Inserta en esta instancia la representación en forma de cadena de un entero de 16 bits sin signo, en la posición del carácter que se haya especificado.
Método público Insert(Int32, UInt32) Inserta en esta instancia la representación en forma de cadena de un entero de 32 bits sin signo, en la posición del carácter que se haya especificado.
Método público Insert(Int32, UInt64) Inserta en esta instancia la representación en forma de cadena de un entero de 64 bits sin signo, en la posición del carácter que se haya especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Insert(Int32, String, Int32) Inserta en la instancia una o más copias de una cadena concreta en la posición del carácter que se haya especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Insert(Int32, Char[], Int32, Int32) Inserta en la instancia la representación en forma de cadena de una submatriz concreta de caracteres Unicode en la posición del carácter que se haya especificado.
Método protegido Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif MemberwiseClone Crea una copia superficial del objeto Object actual. (Se hereda de Object).
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Remove Elimina de la instancia el intervalo de caracteres especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Replace(Char, Char) Reemplaza todas las apariciones de un carácter especificado en la instancia por otro carácter especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Replace(String, String) Reemplaza todas las apariciones de una cadena especificada en la instancia por otra cadena especificada.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Replace(Char, Char, Int32, Int32) En una subcadena de la instancia, reemplaza todas las apariciones de un carácter especificado por otro carácter especificado.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif Replace(String, String, Int32, Int32) En una subcadena de la instancia, reemplaza todas las apariciones de una cadena especificada por otra cadena especificada.
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif ToString() Convierte el valor de la instancia en un objeto String. (Invalida a Object.ToString()).
Método público Compatible con XNA Framework y9sxk6fy.PortableClassLibrary(es-es,VS.100).gif ToString(Int32, Int32) Convierte el valor de una subcadena de la instancia en un objeto String.
Arriba
  Nombre Descripción
Implementación explícita de interfaces Método privado ISerializable.GetObjectData Infraestructura. Rellena un objeto System.Runtime.Serialization.SerializationInfo con los datos necesarios para deserializar el objeto StringBuilder actual.
Arriba

Esta clase representa una cadena como un objeto, cuyo valor es una secuencia de caracteres modificable. Se dice que el valor es modificable porque puede cambiarse una vez se ha creado mediante la adición, sustracción, sustitución o inserción de caracteres. Para comparar, vea la clase String.

La mayoría de los métodos que modifican una instancia de esta clase, devuelven una referencia a esa misma instancia. Dado que se devuelve una referencia a la instancia, se puede llamar a un método o a una propiedad en una referencia. Esto puede ser conveniente si lo que se pretende es escribir una única instrucción que encadene sucesivas operaciones.

La capacidad de un StringBuilder corresponde al mayor número de caracteres que la instancia pueda almacenar en un tiempo determinado, y es mayor o igual que la longitud de la representación de la cadena del valor de la instancia. La capacidad puede incrementarse o disminuirse mediante la propiedad Capacity o bien mediante el método EnsureCapacity pero no puede ser menor que el valor de la propiedad Length.

Se usan valores predeterminados específicos de la implementación si no se especifica la capacidad o la capacidad máxima al inicializarse una instancia de StringBuilder.

Consideraciones sobre el rendimiento

Los métodos Concat y AppendFormat concatenan los nuevos datos en un objeto String o StringBuilder existente. La operación de concatenación en un objeto String siempre crea un nuevo objeto a partir de la cadena existente y los nuevos datos. Un objeto StringBuilder mantiene un búfer para alojar la concatenación de nuevos datos. Los nuevos datos se anexan al final del búfer si hay espacio disponible; de lo contrario, se asigna un nuevo búfer más grande, los datos del búfer original se copian en el nuevo búfer y, a continuación, los nuevos datos se anexan al nuevo búfer.

El rendimiento de una operación de concatenación para un objeto String o StringBuilder depende de la frecuencia con que se produzca la asignación de memoria. La operación de concatenación en un objeto String siempre asigna memoria, mientras que la operación de concatenación en un objeto StringBuilder sólo asigna memoria si el búfer del objeto StringBuilder es demasiado pequeño para alojar los nuevos datos. Por ello, la clase String es preferible para una operación de la concatenación si un se concatena un número fijo de objetos String. En ese caso, el compilador podría combinar en una única operación cada una de las operaciones de concatenación. Los objetos StringBuilder son preferibles para las operaciones de concatenación si se concatena un número arbitrario de cadenas; por ejemplo, si un bucle concatena un número aleatorio de cadenas de datos proporcionados por el usuario.

Notas para los implementadores

La capacidad predeterminada para esta implementación es 16, y la capacidad máxima predeterminada es Int32.MaxValue.

StringBuilder puede asignar más memoria en la medida en que se necesite para almacenar caracteres cuando se amplía el valor de una instancia; la capacidad se ajustará en la misma medida. La cantidad de memoria asignada es específica de la implementación y se produce ArgumentOutOfRangeException o OutOfMemoryException si la cantidad de memoria necesaria es mayor que la capacidad máxima.

Por ejemplo, los métodos Append, AppendFormat, EnsureCapacity, Insert y Replace pueden aumentar el valor de una instancia.

Se puede obtener acceso a los caracteres individuales del valor de StringBuilder mediante la propiedad Chars. Las posiciones de los índices empiezan por cero.

En el ejemplo siguiente se muestra cómo llamar a muchos de los métodos que define la clase StringBuilder.


using System;
using System.Text;

public sealed class App 
{
    static void Main() 
    {
        // Create a StringBuilder that expects to hold 50 characters.
        // Initialize the StringBuilder with "ABC".
        StringBuilder sb = new StringBuilder("ABC", 50);

        // Append three characters (D, E, and F) to the end of the StringBuilder.
        sb.Append(new char[] { 'D', 'E', 'F' });

        // Append a format string to the end of the StringBuilder.
        sb.AppendFormat("GHI{0}{1}", 'J', 'k');

        // Display the number of characters in the StringBuilder and its string.
        Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString());

        // Insert a string at the beginning of the StringBuilder.
        sb.Insert(0, "Alphabet: ");

        // Replace all lowercase k's with uppercase K's.
        sb.Replace('k', 'K');

        // Display the number of characters in the StringBuilder and its string.
        Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString());
    }
}

// This code produces the following output.
//
// 11 chars: ABCDEFGHIJk
// 21 chars: Alphabet: ABCDEFGHIJK


.NET Framework

Compatible con: 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Compatible con: 4, 3.5 SP1

Compatible con:

Windows 7, Windows Vista SP1 o posterior, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (no se admite Server Core), Windows Server 2008 R2 (se admite Server Core con SP1 o posterior), Windows Server 2003 SP2

.NET Framework no admite todas las versiones de todas las plataformas. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
Todos los miembros static (Shared en Visual Basic) públicos de este tipo son seguros para la ejecución de subprocesos. No se garantiza que los miembros de instancias sean seguros para la ejecución de subprocesos.
¿Le ha resultado útil?
(Caracteres restantes: 1500)
Contenido de la comunidad Agregar
String
static void Main(string[] args)
        {
            //1. Asignar el valor "Entornos gráficos 2011-2012 inicial al objeto Srring.
            string cadena = "Entornos gráficos 2011-2012";
            Console.Write("Cadena:" +cadena);

            //2. Ver el tamaño de la cadena de caracteres.
            int tamaño = cadena.Length;
            Console.Write("Tamaño de la cadena:" +tamaño);

            //3. Mostrar cada uno de los caracteres de la cadena separados por un espacio en blanco.
            for (int i = 0; i < cadena.Length; i++)
            {
                Console.Write(cadena[i]);
                Console.Write(" ");
            }
            Console.WriteLine();
           
            //4. Comparar la cadena con otra que se lea por teclado. Comprueba que pasa en la comparación entre mayúsculas y minúsculas.
            String b = cadena.ToUpper();
            Console.WriteLine("Cadena b: "+b);
            if(cadena.Equals(b,StringComparison.CurrentCultureIgnoreCase) == true)
                Console.WriteLine("Son iguales");
            else
                Console.WriteLine("Son distintas");

            if (String.Compare(cadena,b, StringComparison.CurrentCultureIgnoreCase) == 0)
                Console.WriteLine("Son iguales");
            else
                Console.WriteLine("Son distintas");
           
            Console.Write("Dame una cadena");
            string cadena1 = Console.ReadLine();
            if (cadena.CompareTo(cadena1)==0)
                Console.WriteLine("iguales");
            else
                Console.WriteLine("no iguales");

            //5. Mostrar la posición en la que se encuentra la cadena "2011" utilizando la búsqueda por delante.
            int pos=cadena.IndexOf("Gráficos", StringComparison.CurrentCultureIgnoreCase);
            if(pos>=0)
                Console.WriteLine("Encontrado en "+pos);
            else
                Console.WriteLine("No encontrado");
           
           
            Console.WriteLine(cadena.IndexOf("2011"));

            //6.Mostrar la posición en la que se encuentra la cadena "gráficos" utilizando la búsqueda por detrás.
            Console.WriteLine("última posición de gráficos: " + cadena.Length);
            Console.WriteLine(cadena.LastIndexOf("gráficos"));

            //7.Extraer la cadena "2011-2012".
            Console.WriteLine(cadena.Substring(cadena.IndexOf("2011-2012"), "2011-2012".Length));

            Console.ReadKey();


        }
StringBuilder
static void Main(string[] args)
        {
            //1. Asignar el valor "Entornos gráficos" inicial al objeto StringBuilder.
            StringBuilder cadena = new StringBuilder("Entornos Gráficos");

            //2. Ver el tamaño de la cadena en caracteres.
            Console.WriteLine(cadena.Length);

            //3. Añadir por detrás "2011-2012".//3
            string aux = "2011-2012";
            cadena.AppendFormat("{0}", aux);
            Console.WriteLine(cadena);

            //4. Insertar por delante "DAI2".
            cadena.Insert(0,"DAI 2");
            Console.WriteLine(cadena);

            //5. Cambiar "gráficos" por "GRÁFICOS".
            cadena.Replace("graficos", "GRAFICOS");
            Console.WriteLine(cadena);

            //6. Eliminar de la cadena la palabra "Entornos".
            string quitar = "Entornos";
            cadena.Remove(cadena.ToString().IndexOf(quitar), quitar.Length);
            Console.WriteLine(cadena);

            Console.ReadKey();           
        }
Ejemplo Stringbuilder
$0$0 $0
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace principal
{
    class Program
    {
        static void Main(string[] args)
        {
            //1
            StringBuilder cadena = new StringBuilder("Entornos gráficos");

            //2
            Console.WriteLine(cadena.Length);

            //3
            string aux=" 2011-2012";
            cadena.AppendFormat("{0}",aux);
            Console.WriteLine(cadena);

            //4

            cadena.Insert(0,"DAI2 ");
            Console.WriteLine(cadena);

            //5


            cadena.Replace("gráficos", "GRÁFICOS");
            Console.WriteLine(cadena);

            //6
            string quitar="Entornos";
            cadena.Remove(cadena.ToString().IndexOf(quitar), quitar.Length);
            Console.WriteLine(cadena);
            Console.ReadKey();

        }
    }
}
$0
$0$0 $0$0 $0