搜索
简帛阁>技术文章>C#11 file关键字

C#11 file关键字

C#11添加了文件作用域类型功能:一个新的file修饰符,可以应用于任何类型定义以限制其只能在当前文件中使用。

这样,我们可以在一个项目中拥有多个同名的类。
通过下面的项目显示,该项目包含两个名为Answer的类。
 
文件File1.cs中
namespace ConsoleApp11
{
    file static class Answer
    {
        internal static string GetFileScopeScret() => "File1.cs";
    }

    static class InternalClassFromFile1
    {
        internal static string GetString() => Answer.GetFileScopeScret();
    }
}
 
文件File2.cs中
namespace ConsoleApp11
{
    file static class Answer
    {
        internal static string GetFileScopeScret() => "File2.cs";
    }

    static class InternalClassFromFile2
    {
        internal static string GetString() => Answer.GetFileScopeScret();
    }
}
调用这两个方法,可以正常输出
        static void Main(string[] args)
        {
            Console.WriteLine(InternalClassFromFile1.GetString());
            Console.WriteLine(InternalClassFromFile2.GetString());
        }
 
这里有几点说明:
  • 可以在其源文件之外间接访问带有file修饰符的类型。在上面的程序中,我们依赖这些类,并从 InternalClassFromFile1 与 InternalClassFromFile2中访问。
  • file类也可以接口在其源文件之外间接使用,演示如下

 

修改File.cs中代码
namespace ConsoleApp11
{
    file class Answer : IAnswer
    {
        public string GetFileScopeSecret() => "File1.cs";
    }
    internal interface IAnswer
    {
        string GetFileScopeSecret();
    }
    static class InternalClassFromFile1
    {
        internal static IAnswer GetAnswer() => new Answer();
    }
}
调用方法,即可正常输出
        static void Main(string[] args)
        {
            Console.WriteLine(InternalClassFromFile1.GetAnswer().GetFileScopeSecret());
        }
  • 任何类型的类型都可以用file修饰符标记:class,  interface ,  record ,  struct,  enum,  delegate.
  • file不能与其他修饰符(如internal or  public)一起使用。
  • 只要所有类型定义属于同一个文件,就可以使用分部类,如下所示:

 

namespace ConsoleApp1 {
   file static partial class Answer {
      internal static string GetFileScopeSecret()
         => "Answer from File1.cs";
   }
   file static partial class Answer {
      internal static string AnotherGetFileScopeSecret()
         => "Another Answer from File1.cs";
   }
}
  • 该 file修饰符不适用于嵌套在父类型中的类型。它也不适用于方法属性、事件和字段,但语言设计说明解释说:“为非类型文件范围的成员留出设计空间,以便以后出现。”
  • 在一个项目中,可以有一个internal级别类,同时可以用友一个或多个file级别的同名类。唯一的缺点是文件类不能在公共类中使用。
 
让我们强调一下,namespace仍然是避免类型名称冲突的首选方法。
 

C#/.net/.net core QQ群:953553560


                
1、实例化对象,执行构造函数Teachert3newTeacher(张三,100,100,100);2、隐藏父类的成员1classPerson2{3publicvoidSayHello()4{5Con
1、显示调用父类的构造函数1classProgram2{3staticvoidMain(string[]args)4{5TeachertnewTeacher();67ConsoleReadKey();
能进到这篇文章……首先你可能明白类似于1doublenum0;2intm(int)num;或者你明白1intm209;2StringstrmtoString();或者说你甚至见过1charm'c';
///<summary>///向论坛传图片文件///</summary>///<paramnamefilePath></param>///<par
例子:usingSystem;usingSystemCollectionsGeneric;usingSystemText;namespaceTest{classProgram{staticvoidMa
C中可以将类、结构或接口的定义拆分到两个或多个源文件中,在类声明前添加partial关键字即可。1什么是局部类型?C20引入了局部类型的概念。局部类型允许我们将一个类、结构或接口分成几个部分,分别实现
1、代表当前类的对象1classProgram2{3staticvoidMain(string[]args)4{5TeachertnewTeacher();6ConsoleWriteLine(tget
using关键字有两个主要用途:(一)作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。(二)作为语句,用于定义一个范围,在此范围的末尾将释放对象。using指令①允许在命名空间中使用
一、类型的转换在c中类型的转换分两种:显式和隐式,基本的规则如下:基类对象转化为子类对象,必须显式转换,规则:(类型名)对象。值类型和引用类型的转换采用装箱(boxing)或拆箱(unboxing)
volatileintAge10;publicintGetAge(){returnAge;}如上例子,调用GetAge()得到的是“主”内存区域的Age数值。用volatile修饰后的变量不允许有不同