C# 隐式程序集范围使用指令
我们有一个核心库(CoreLibrary),其中包含在每个程序集中是非常有意义的。 目前有很多扩展方法,在每个文件中,我必须通过C# 隐式程序集范围使用指令,c#,C#,我们有一个核心库(CoreLibrary),其中包含在每个程序集中是非常有意义的。 目前有很多扩展方法,在每个文件中,我必须通过 using CoreLibrary; 是否可以使用CoreLibrary在每个程序集中隐式地包含,这样我就不必像mscorlib那样自己编写了?原因不仅是为了节省输入,而且是为了那些不知道扩展方法存在的用户 原因如下。我有一个 interface IArray { int Size { get;} // Returns data with a newly
using CoreLibrary;
是否可以使用CoreLibrary在每个程序集中隐式地包含,这样我就不必像mscorlib那样自己编写了?原因不仅是为了节省输入,而且是为了那些不知道扩展方法存在的用户
原因如下。我有一个
interface IArray
{
int Size { get;}
// Returns data with a newly created array.
T[] GetData<T>();
// Returns data in an already existing array.
void GetData<T>(T[] data);
}
interface-ray
{
整数大小{get;}
//使用新创建的数组返回数据。
T[]GetData();
//返回已存在数组中的数据。
void GetData(T[]数据);
}
在实现IArray的每个类之前,都必须实现这两种方法(我有几个…)
类数组1d:IArray
{
公共整数大小{get;}
//使用新创建的数组返回数据。
T[]获取数据()
{
var数据=新的T[大小];
获取数据(数据);
返回数据;
}
//返回已存在数组中的数据。
void GetData(T[]数据)
{
//产生数据
}
}
现在我认为我可以在接口中使用默认实现,这样我就可以为实现IArray的每个类去掉每个完全相同的GetData实现
interface IArray
{
int Size { get;}
// Returns data with a newly created array.
T[] GetData<T>()
{
var data = new T[Size];
GetData(data);
return data;
}
// Returns data in an already existing array.
void GetData<T>(T[] data);
}
interface-ray
{
整数大小{get;}
//使用新创建的数组返回数据。
T[]获取数据()
{
var数据=新的T[大小];
获取数据(数据);
返回数据;
}
//返回已存在数组中的数据。
void GetData(T[]数据);
}
到目前为止还不错,但是我知道我总是需要强制转换到IArray来获得对默认实现的访问,这是不可行的,而且对于默认实现,现在似乎还有其他方法。因此,我们想到了使用扩展方法
public static class ArrayExtensions : IArray
{
public int Size { get;}
// Returns data with a newly created array.
public static T[] GetData<T>(this IArray array)
{
var data = new T[array.Size];
array.GetData(data);
return data;
}
}
公共静态类ArrayExtensions:IArray
{
公共整数大小{get;}
//使用新创建的数组返回数据。
公共静态T[]GetData(此IArray数组)
{
var data=newt[array.Size];
数组.GetData(数据);
返回数据;
}
}
它工作得很好,但现在的效果是我必须包含名称空间,这基本上是可以的,但是在您可以通过Intellisense直接看到您有什么方法之前,如果您以前没有使用过扩展方法,那么现在您不知道扩展方法
是否可以使用CoreLibrary在每个程序集中隐式地包含,这样我就不必像mscorlib那样自己编写了
K、 这里有三件不同的事情我们需要分开,但最终我相信答案只是“不”,但是
“在每个程序集中”-使用
指令在每个文件中最宽(它们也可以是每个文件中的每个命名空间
作用域)-而不是每个程序集(甚至每个类型,由于部分
);它不能全局应用
在汇编级别,您需要一个引用,而不是使用
指令的——可能是一个包引用;通过将
(或类似内容)放在构建树中较高目录中的目录.Build.props
文件中,这是一种可以全局应用的方法(注意:使用
指令,拥有引用不会改变对每个文件的需求;这是“必要但不够的”)
“就像mscorlib做的那样?”-mscorlib不做这样的事
我无法想象这是可能的。对于最基本的.Net名称空间,例如“System”,它甚至不可能在每个源文件中使用。除此之外,“隐性使用”对我来说也不是什么好主意。这将使你的命名空间与只有自己语言类型的“上帝命名空间”相称,比如“int”或“BoOL”。“像McScLIB”——意思是什么?甚至使用系统代码>不是隐式的-它需要每个文件;你能举例说明你的意思吗?但是不,在常规C#中,隐式使用指令不是一件事;您可以在razor(cshtml)@Sinatr中实现这一点,它是一个using指令别名;不同的场景,尽管答案仍然是“否,它是每个文件/命名空间”@ GSELG语言,官方的位置是@ MSEDI重新编辑:考虑LINQ-一级语言特征(如果您使用“<代码>从X中的FO 语法等”)-通常基于扩展方法:仍然需要使用
指令获得正确的。这似乎是一个文档问题,而不是其他任何问题。。。
public static class ArrayExtensions : IArray
{
public int Size { get;}
// Returns data with a newly created array.
public static T[] GetData<T>(this IArray array)
{
var data = new T[array.Size];
array.GetData(data);
return data;
}
}