C# 不使用函数直接将字符串限制为特定长度
不是复制品 我想让一根绳子有一个最大长度。它不应该超过这个长度。假设长度为20个字符。如果提供的字符串>20,则取前20个字符串并丢弃其余字符串 这个问题的答案显示了如何用函数来限制字符串,但我想直接在没有函数的情况下这样做。我希望每次写入字符串时都进行字符串长度检查 下面是我不想做的事情:C# 不使用函数直接将字符串限制为特定长度,c#,unity3d,C#,Unity3d,不是复制品 我想让一根绳子有一个最大长度。它不应该超过这个长度。假设长度为20个字符。如果提供的字符串>20,则取前20个字符串并丢弃其余字符串 这个问题的答案显示了如何用函数来限制字符串,但我想直接在没有函数的情况下这样做。我希望每次写入字符串时都进行字符串长度检查 下面是我不想做的事情: string myString = "my long string"; myString = capString(myString, 20); //<-- Don't want to call a f
string myString = "my long string";
myString = capString(myString, 20); //<-- Don't want to call a function each time
string capString(string strToCap, int strLen)
{
...
}
然后,我可以轻松地使用它,而无需调用函数来限制它:
userName = "Programmer";
问题是,我要限制的每个字符串都必须定义多个变量。在本例中,\u用户名
和用户名
(属性)变量
不需要为每个字符串创建多个变量,同时也不需要每次修改字符串时调用函数,这样做是否明智?创建一个具有字符串属性的类,并将所有代码放在那里。然后,您可以在任何地方使用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;
有趣的情况-我建议创建一个结构
,然后为它定义一个类似于中所做的
注意:不幸的是,这不是完美的解决方案-因为隐式转换无法将现有值转移到新实例,因此任何使用非默认长度值初始化的CappedString
都需要使用构造函数进行赋值,或者其长度限制将恢复为默认值。希望避免创建另一个包含主字符串的类实例。这是多个步骤,比我问题中的代码占用更多内存。将等待,看看是否有其他方法。比起我的答案,我更喜欢这个。(我正在寻找一种方法来定义操作符。)干得好!运算符重载+struct也很棒。我刚试过。我得到ArgumentOutOfRangeException:startIndex+length>this.length
exception。我想你应该试试看yourself@Programmer你说得对!我只是逐字复制原始代码,但当字符串短于最大长度时,它似乎会阻塞。我编辑它是为了…制作一个更丑陋的三元结构,所以你可能想重构,也可能不想重构=P@Bergi不幸的是,后者。因为C#不允许赋值运算符实际重载,所以这是我能想到的最好的方法。以后需要非默认长度限制的赋值仍然需要显式调用构造函数,而不是依赖隐式转换…以及下面的答案,您可以使用AOP框架(如PostSharp)来定义拦截属性设置器的属性。PostSharp提供免费/快速版。感谢您的建议。我正在使用Unity3D和Mono,并试图防止使用会增加二进制大小或在移动设备上造成问题的第三方库。不知道它是否有效,但Unity是否尊重内置到.NET的功能?StringLength
来自System.ComponentModel.DataAnnotations
命名空间。在统一中不被包括或承认的。这是Unity在其.NET3.5中没有包含的功能之一。
Superstring s = new Superstring("z");
s.Value = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
string s2 = s.Value;
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);