gpt4 book ai didi

c# - 如何在 C# 中创建自定义强制转换?

转载 作者:太空宇宙 更新时间:2023-11-03 18:34:17 26 4
gpt4 key购买 nike

有这个代码:

string abc = "123456";

要转换为 int 我应该使用 convert:

int abcInt = Convert.ToInt32(abc);

问题是,如果不是数字,我会看到返回零的异常,所以我的最终代码将如下所示:

try{ int abcInt = Convert.ToInt32(abc); }catch(Exception e){ int abcInt = 0; }

所以你看到我决定创建一本书,让我成为一个对象,如果它失败了,毫无异常(exception)地返回零数字,这样可以保持最灵活的编程,没有太多垃圾代码:

int abcInt = Libs.str.safeInt(abc);

代码是:

public int safeInt(object ob)
{
if ((ob == null) || (String.IsNullOrEmpty(ob.ToString())))
return 0;
try
{
return Convert.ToInt32(
System.Text.RegularExpressions.Regex.Replace(ob.ToString(), @"@[^Ee0-9\.\,]+@i", "").
ToString(CultureInfo.InvariantCulture.NumberFormat)
);
}
catch (FormatException e)
{
return 0;
}
}

但我想更进一步,做这样的事情:

int abcInt = (safeInt)abc;

怎么办?

Can not convert type 'string' to 'Libs.safeInt.safeInt'

最佳答案

应该只使用 Int32.TryParse :

int abcInt;
if(!Int32.TryParse(abc, out abcInt)) {
abcInt = 0;
}
// abcInt has been parsed to an int, or defaulted to zero

请注意,这可以缩短为

int abcInt;
Int32.TryParse(abc, out abcInt);

如果你想要的只是默认值为零 because :

When this method returns, contains the 32-bit signed integer value equivalent to the number contained in s, if the conversion succeeded, or zero if the conversion failed. The conversion fails if the s parameter is null, is not of the correct format, or represents a number less than MinValue or greater than MaxValue. This parameter is passed uninitialized.

我实际上建议不要这样写,因为现在你无法区分 abc = "0"abc = "garbage";两者都表现出与上述两行代码完全相同的行为。使用上面的初始版本(即 if,如果需要,您可以区分这两种情况;静默忽略错误通常 em>坏主意)。

就是说,如果您绝对非常想知道如何实现 explicit cast operator ,您可以这样进行:

class SafeInt32 {
private readonly int value;
public int Value { get { return this.value; } }

private readonly string source;
public string Source { get { return this.source; } }

private readonly bool successful;
public bool Successful { get { return this.successful; } }

public SafeInt32(string source) {
this.source = source;
this.successful = Int32.TryParse(source, out this.value);
}

public static explicit operator SafeInt32(string source) {
return new SafeInt32(source);
}

public static implicit operator int(SafeInt32 safeInt32) {
return safeInt32.Value;
}
}

用法:

int abcInt = (SafeInt32)"123456";

请注意,我们必须定义一个 explicit 转换运算符来将 string 转换为 SafeInt32,并定义一个 implicit cast operator 来转换 SafeInt32int 以实现所需的语法。后者是必要的,以便编译器可以静默地将 (SafeInt32)"123456" 的结果转换为 int

再次,我建议反对这个;使用 Int32.TryParse

关于c# - 如何在 C# 中创建自定义强制转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17705349/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com