类中static、const、readonly、partial修饰符

2024-03-01 21:32

本文主要是介绍类中static、const、readonly、partial修饰符,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

static

修饰类成员:
static在C#中的用法与C++类似,当声明一个类成员为静态时,意味着无论有多少个类的对象被创建,只会有一个静态成员的副本,static变量可在成员函数或类的定义外部进行初始化,也可以在类内部定义初始化静态变量,被static修饰的函数也称静态函数,静态函数成员可以访问其他静态成员,但不能访问实例成员,我们可以从类的外部访问静态成员,但在访问时,C#和C++在访问时有所不同C#中class.静态成员,且C#中只能用类来访问static成员,而不能用对象.静态成员来访问C++中:既可以使用class::静态成员 来访问,也可以通过对象.静态成员来访问,只是C++中在类内部定义完static成员后必须在类外进行初始化

    class Program{static int i = 100;static void Main(string[] args){Console.WriteLine(Program.i); //100}}

修饰类(静态类):

静态类中所有成员都是静态的,静态类用于存放不受实例数据影响的数据和函数,静态类的一个常见的用途可能就是创建一个包含一组数学方法和值的数学库,关于静态类的特点如下:
(1)类本身必须标记为static  例如:static public class A
(2)类的所有成员必须是静态的
(3)类可以有一个静态构造函数,但不能有实例构造函数,不能创建该类的实例
(4)静态类是隐式密封的,也就是说不能继承静态类

    static class A{static public int a = 100;static public void foo() { }  //成员必须是静态的//public void foo() { } 不能有实例成员}//class B : A { }  不能继承静态类class Program{static void Main(string[] args){//A a = new A(); 不能创建静态类的实例Console.WriteLine(A.a);}}

const

const在C#中的使用与C++有所不同,const用于在类中定义成员常量,它只能修饰值类型数据,不能修饰引用类型数据,与本地常量类似,用于初始化成员常量的值在编译时必须是可计算的,而且C#在声明成员常量的时候就必须对其进行初始化,否则会出错,C++中const修饰的数据成员则既可以在声明时直接初始化,也可以在声明后在构造函数的初始化列表中进行初始化定义,与C++不同,C#中没有全局常量,每个常量都必须声明在类内。

特点:常量的表现像静态值,它们对类的每个实例都是"可见的",而且即使没有类的实例也可以使用,所以也可以通过
class.成员常量来访问,与真正的静态量不同,常量没有自己的存储位置,而是在编译时被编译器替换,这种方式类似于C++中的#define值。虽然常量成员表现的像一个静态量,但不能将常量声明为static,C++中static和const是可以一起使用的

    class Program{const int i = 10;//const int i; 错误,成员常量必须在定义的时候就初始化且不允许再次赋值//const static int=100; 不存在这种写法static void Main(string[] args){Console.WriteLine(Program.i); //10}}

readonly

字段可以用readonly修饰符来声明,其作用类似于将字段声明为const,一但值被设定就不能改变,readonly既可以修饰值类型数据也可以修饰引用类型数据,readonly修饰值类型数据只能直接初始化或者在构造函数中初始化,如果尝试在其他方法(即使这个方法只被构造函数调用)中初始化,会得到一个编译错误

readonly修饰值类型数据与引用类型数据的不同:

1.修饰值类型:readonly修饰的值类型数据不能在任何地方对这个值进行修改,作用相当于const
2.修饰引用类型:readonly修饰的引用类型数据不能在任何地方对这个引用(理解为指针更好)进行修改,但是可以修改它指向的数据内容

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace GameMain
{class Program{private const int a = 100;static void Main(string[] args){dd d = new dd();//可以改变readonly修饰的引用类型数据所指向的值d.fun();d.dic.Add(2, 1);foreach (var v in d.dic){Console.WriteLine(v.Key);Console.WriteLine(v.Value);//打印 1 1 2 1}//d.i = 1;  不能改变readonly修饰的值类型数据的值}}public class dd{public readonly Dictionary<int, int> dic = new Dictionary<int, int>();public readonly int i = 100;public void fun(){dic.Add(1, 1);}}
}

readonly与const的区别:
(1)const字段只能在字段的声明语句中初始化,而readonly字段没有这个限制
(2)const字段的值必须在编译时决定,而readonly字段的值,可以在运行时决定,这种增加的自由性允许你在不同的环境或不同的构造函数中设置不同的值
(3)和const不同,const行为总是静态的,而对于readonly字段,它可以是实例字段也可以是静态字段,它在内存中有存储位置

    class Program{public readonly int a;public static readonly int b;static Program(){b = 200; //static修饰的可在静态构造函数中初始化}Program(){a = 100; }static void Main(string[] args){Program p = new Program();Console.WriteLine(p.a);  //100Console.WriteLine(Program.b);  //200}}

partial

partial为分部类型,在C#中类的声明可以分割成几个分部类的声明。类型修饰符partial不是关键字,所以在其他上下文中,可以在程序中把它用作标识符,但直接用在关键字class、struct或interface之前时,它表示分部类型。

partial声明分部类:
(1)每个分部类的声明都含有一些类成员的声明
(2)类的分部类声明可以在同一文件中也可以在不同文件中
(3)每个局部声明必须被标为partial class,而不是单独的关键字class
(4)组成类的所有分部类声明必须在一起编译,使用分部声明的类必须有相同的含义,就好像所有类成员都声明在一个单独的类声明体内

分部方法时声明在分部类中不同部分的方法,分部方法的不同部分可以声明在不同的分部类中

partial声明分部方法:
(1)定义声明和实现声明的签名和返回类型必须匹配
(2)返回类型必须是void
(3)签名不能包括访问修饰符,这使分部方法时隐式私有的
(4)参数列表不能包含out参数
(5)在定义声明和实现声明中都必须包含上下文关键字partial,直接放在关键字void之前
(6)可以有定义部分而没有实现部分,在这种情况下编译器把方法的声明以及方法内部任何对方法的调用都移除,不能只有分部方法的实现部分而没有定义部分

    partial class A{partial void foo(int i);  //声明}partial class A{partial void foo(int i)  //实现{Console.WriteLine(i);  //1000}public void fun(int i){foo(i);   }}class Program{static void Main(string[] args){A a = new A();//a.foo();  分部方法是private的权限,所以不能直接访问a.fun(1000);  //如果想调用分部方法,只能再定义一个接口}}

 

 

这篇关于类中static、const、readonly、partial修饰符的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/763892

相关文章

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给

java类中定义接口的有哪些好处

第一步:首先是是定义一个类,同时里面定义接口 public class Util { public interface Worker { void work(int a); } } 第二步:定义一个类去实现第一步类中定义的接口 public class Demo implements Worker { @Override public void work(int a) { System

java基础总结08-面向对象4(static关键字)

原来一个类里面的成员变量,每new一个对象,这个对象就有一份自己的成员变量,因为这些成员变量都不是静态成员变量。对于static成员变量来说,这个成员变量只有一份,而且这一份是这个类所有的对象共享。 静态成员变量与非静态成员变量的区别 以下面的例子为例说明 package cn.galc.test;public class Cat {/*** 静态成员变量*/private static

Flask 创建app 时候传入的 static_folder 和 static_url_path参数理解

Flask 在创建app的时候 是用 app = Flask(__name__) 来创建的,不传入 static_folder参数的话 ,默认的静态文件的位置是在 static目录下 我们可以进入 Flask的源码里面查看 ctrl+鼠标左键进入 这是Flask的 __init__源码(后面还有一些,我就选了需要的代码)     def __init__(self,import_

C#static用法和扩展方法

一.static可用于修饰成员和类 1.1 静态成员 静态成员始终按类名(而不是实例名称)进行访问。 静态成员只有一个副本存在(与创建的类的实例数无关)。 静态方法和属性无法在其包含类型中访问非静态字段和事件,它们无法访问任何对象的实例变量,除非在方法参数中显式传递它。 更典型的做法是声明具有一些静态成员的非静态类(而不是将整个类都声明为静态)。 静态字段的两个常见用途是保留实例化的对象数的

c++ public、protected 、 private访问修饰符详解

在 C++ 中,访问修饰符用于控制类的成员(数据成员和成员函数)的访问权限。主要的访问修饰符有三个:public、protected 和 private。每种修饰符的访问规则如下: 1. public 定义:public 修饰符表示该成员对所有代码都是可见的,任何对象都可以访问和修改。作用:允许类外部的代码访问这些成员。 class Example {public:int publicVa

访问修饰符public、protected、private,基于C++

一、基本概念 公有(public)成员   公有成员在程序中类的外部是可访问的。您可以不使用任何成员函数来设置和获取公有变量的值, 私有(private)成员  私有成员变量或函数在类的外部是不可访问的,甚至是不可查看的。只有类和友元函数可以访问私有成员。 默认情况下,类的所有成员都是私有的。例如在下面的类中,width 是一个私有成员,这意味着,如果您没有使用任何访问修饰符,类的成

s let 和const的区别 ,它们可以变量提升吗

在 JavaScript 中,let 和 const 是 ES6 引入的新变量声明关键字,它们与之前的 var 关键字相比,有几个重要的区别。特别是关于变量提升(hoisting)的行为不同。 变量提升(Hoisting) 在 JavaScript 中,“变量提升”是指变量声明会被提升到作用域的顶部,但变量的初始化不会。这意味着你可以先使用变量,然后再声明它。然而,let 和 const 的行