Кап-строка до определенной длины непосредственно без функции
Не дубликат этого.
Я хочу, чтобы строка имела максимальную длину. Он никогда не должен проходить эту длину. Допустим, длина 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;