C#限制字符串的长度

时间:2011-11-23 20:26:25

标签: c# string class

我有以下课程:

public class VendorClass {         
    public int VendorID { get; set; }
    public string VendorName { get; set; }
}

上面的字段匹配数据库表中的字段。 如果说VendorName,我该如何给它一个字段宽度?

VendorName映射到数据库中varchar(15)

的字段

6 个答案:

答案 0 :(得分:8)

您不能限制字符串的长度,但可以使用带有支持字段的属性来获得所需的结果:

public class VendorClass
{
    public int VendorID {  get; set; }

    private string _vendorName;

    public string VendorName
    {
        get { return _vendorName; }
        set
        {
            if (value.Length > 15)
            {
                _vendorName = value.Substring(0,15);                    
            } else { 
                _vendorName = value;
            }
        }
    }
}

答案 1 :(得分:3)

C#中的字符串几乎具有任意长度。

从数据库加载时,它会自动适应实际的字符串长度。保存到数据库时,您的业务逻辑,数据层或ORM(视情况而定)需要确保适当的最大长度。

答案 2 :(得分:2)

字符串在C#中不能有设定的长度。您必须通过其他一些机制(如验证)来处理数据库长度。没有更多细节,无法真正告诉你更多。

答案 3 :(得分:0)

我会问你为什么要在c#代码中这样做。但是this link有两种解决方法。我认为截断或采取子循环是最好的选择。您还可以确保UI(或模型视图)处理此类详细信息。

答案 4 :(得分:0)

我不确定您的要求是什么,但如果您想知道字符串的最大长度,question可以帮助您。

如果您想限制输入的字符数,我建议您使用服务器端验证和/或客户端验证。

答案 5 :(得分:0)

我刚刚遇到了一个像你描述的那样的问题,并找到了一种创建有限长度字符串的方法。当数据库中只有有限的 varchar 长度定义时,可能有点不灵活但简洁。

首先介绍一些基础类:

public class Length16
{
    public static int StringLength { get => 16; }
}

public class Length8
{
    public static int StringLength { get => 8; }
}

public class Length15
{
    public static int StringLength { get => 15; }
}

public class LimitedLengthString<T>
{
    private string _sValue;

    public LimitedLengthString(string sNewValue)
    {
        _sValue = sNewValue;
    }

    public static implicit operator LimitedLengthString<T>(string sNewValue)
    {
        var prop = typeof(T).GetProperty("StringLength");

        int iLength = (int)prop.GetValue(null);

        if (sNewValue.Length > iLength)
        {
            throw new Exception($"New string is too long! Allowed length {iLength}.");
        }

        return new LimitedLengthString<T>(sNewValue);
    }

    public static implicit operator string(LimitedLengthString<T> sSource)
    {
        return sSource.ToString();
    }

    public override string ToString()
    {
        return _sValue; 
    }
}

public class AutoTruncatedString<T>
{
    private string _sValue;

    public AutoTruncatedString(string sNewValue)
    {
        _sValue = sNewValue;
    }

    public static implicit operator AutoTruncatedString<T>(string sNewValue)
    {
        var prop = typeof(T).GetProperty("StringLength");

        int iLength = (int)prop.GetValue(null);

        return new AutoTruncatedString<T>(sNewValue.Substring(0, iLength));
    }

    public static implicit operator string(AutoTruncatedString<T> sSource)
    {
        return sSource.ToString();
    }

    public override string ToString()
    {
        return _sValue;
    }
}

像这样使用它们:

LimitedLengthString<Length8> sLimitedLength8;
sLimitedLength8 = "asdfgasdfg"; // will error out

AutoTruncatedString<Length8> sAutoTruncated8;
sAutoTruncated8 = "asdfgasdfg"; // will be truncated

sLimitedLength8 将在您尝试分配长度超过 8 的字符串时抛出错误,而 sAutoTruncated8 将截断您分配给它的字符串。

对于您来说,您可以这样定义 VendorName:

public LimitedLengthString<Length15> VendorName { get; set; }

希望能帮到你。