Кап-строка до определенной длины непосредственно без функции

Не дубликат этого.

Я хочу, чтобы строка имела максимальную длину. Он никогда не должен проходить эту длину. Допустим, длина 20 char. Если предоставленная строкa > 20, возьмите первые 20 строк и отбросьте остальные.

Ответы на этот вопрос показывают, как ограничить строку функцией, но я хочу сделать это напрямую без функции. Я хочу, чтобы проверка длины строки выполнялась каждый раз, когда строка записывается в.

Ниже я хочу не:

string myString = "my long string";
myString = capString(myString, 20); //<-- Don't want to call a function each time

string capString(string strToCap, int strLen)
{
    ...
}

Я смог выполнить это с помощью свойства:

const int Max_Length = 20;
private string _userName;

public string userName
{
    get { return _userName; }
    set
    {
        _userName = string.IsNullOrEmpty(value) ? "" : value.Substring(0, Max_Length);
    }
}

Тогда я могу с легкостью использовать его, вызывая функцию для его закрытия:

userName = "Programmer";

Проблема заключается в том, что каждый string, который я хочу сделать, должен иметь несколько переменных, определенных для них. В этом случае переменные _userName и userName (свойство).

Любой умный способ сделать это без создания нескольких переменных для каждой строки и в то же время, не имея необходимости вызывать функцию каждый раз, когда я хочу изменить string?

Ответы

Ответ 1

Интересная ситуация - я бы предложил создать struct, а затем определить неявный оператор преобразования для него, аналогично тому, что было сделано в этот вопрос о переполнении стека.

public struct CappedString
{
    int Max_Length;
    string val;

    public CappedString(string str, int maxLength = 20)
    {
        Max_Length = maxLength;
        val = (string.IsNullOrEmpty(str)) ? "" :
              (str.Length <= Max_Length) ? str : str.Substring(0, Max_Length);
    }

    // From string to CappedString
    public static implicit operator CappedString(string str)
    {
        return new CappedString(str);
    }

    // From CappedString to string
    public static implicit operator string(CappedString str)
    {
        return str.val;
    }

    // To making using Debug.Log() more convenient
    public override string ToString()
    {
        return val;
    }

    // Then overload the rest of your operators for other common string operations
}

Позже вы можете использовать его так:

// Implicitly convert string to CappedString
CappedString cappedString = "newString";

// Implicitly convert CappedString to string
string normalString = cappedString;

// Initialize with non-default max length
CappedString cappedString30 = new CappedString("newString", 30);

Примечание. К сожалению, это не идеальное решение, потому что неявное преобразование не дает возможности переносить существующие значения в новый экземпляр, любой CappedString, инициализированный значением длины, отличным от значения по умолчанию, необходимо будет присвоить к использованию конструктора, или его предел длины вернется к своему стандарту.

Ответ 2

Создайте класс с свойством string и поместите там весь этот код. Затем вы можете использовать s.Value где угодно в виде строки с требуемым признаком.

Что-то вроде:

class Superstring
{
    int max_Length = 20;
    string theString;

    public Superstring() { }
    public Superstring(int maxLength) { max_Length = maxLength; }
    public Superstring(string initialValue) { Value = initialValue; }
    public Superstring(int maxLength, string initialValue) { max_Length = maxLength; Value = initialValue; }

    public string Value { get { return theString; } set { theString = string.IsNullOrEmpty(value) ? value : value.Substring(0, Math.Min(max_Length, value.Length)); } }
}

и используйте:

Superstring s = new Superstring("z");
s.Value = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
string s2 = s.Value;