gpt4 book ai didi

c# - c# 中 typedef 或子类化字符串的替代方法

转载 作者:可可西里 更新时间:2023-11-01 07:55:30 24 4
gpt4 key购买 nike

情况

我有一个类在内部处理许多不同类型的文件路径:一些是本地的,一些是远程的;一些相对的,一些绝对的。

过去的情况是,它的许多方法将它们作为 string 相互传递,但要准确跟踪每个方法期望的路径类型变得非常困难。

所需的修复

所以我们基本上想typedef四种不同的类型到string:RemoteRelative, LocalRelative, RemoteAbsoluteLocalAbsolute。这样,静态类型检查器可以帮助开发人员确保他们提供和期望具有正确语义的 string

不幸的是,string 在 BCL 中是密封的,所以我们不能通过简单的继承来做到这一点。并且没有简单的 typedef,所以我们也不能那样做。

实际修复

我最终创建了四个不同的简单类,每个类都包含一个readonly string

public struct LocalAbsolutePath {
public readonly string path;
public LocalAbsolutePath(string path) {
this.path = path;
}
}

这基本上是可行的,但最终会增加一些不希望的冗长内容。

问题:我是否忽略了任何自然适合简单 C# 语法的替代方案?

就像我上面提到的,C 风格的 typedef string LocalAbsolutePath; 甚至 F# 风格的 type LocalAbsolutePath = string 将是我的梦想。但即使是从自定义类方向迈出的一步也很棒。

最佳答案

您的解决方案很好。您可以通过向 string 添加类型转换来解决额外的冗长问题,让您可以在 string 可以到达的任何地方使用 LocalAbsolutePath

public struct LocalAbsolutePath { // Making it a class would be OK too
private readonly string path; // <<=== It is now private
public LocalAbsolutePath(string path) {
this.path = path;
}
public static implicit operator string(LocalAbsolutePath p) {
return p.path;
}
}

关于c# - c# 中 typedef 或子类化字符串的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10356642/

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