c#中的class是啥
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#中的class是啥相关的知识,希望对你有一定的参考价值。
class代表什么意思呢
1,class 是引用类型,structs是值类型既然class是引用类型,class可以设为null。但是我们不能将struct设为null,因为它是值类型。
struct AStruct
int aField;
class AClass
int aField;
class MainClass
public static void Main()
AClass b = null; // No error.
AStruct s = null; // Error [ Cannot convert null to 'AStruct'because it is a value type ].
2,当你实例化一个class,它将创建在堆上。而你实例化一个struct,它将创建在栈上
3,你使用的是一个对class实例的引用。而你使用的不是对一个struct的引用。(而是直接使用它们)
4,当我们将class作为参数传给一个方法,我们传递的是一个引用。struct传递的是值而非引用。
5,structs 不可以有初始化器,class可以有初始化器。
class MyClass
int myVar =10; // no syntax error.
public void MyFun( )
// statements
struct MyStruct
int myVar = 10; // syntax error.
public void MyFun( )
// statements
6,Classes 可以有明显的无参数构造器,但是Struct不可以
class MyClass
int myVar = 10;
public MyClass( ) // no syntax error.
// statements
struct MyStruct
int myVar;
public MyStruct( ) // syntax error.
// statements
7,类使用前必须new关键字实例化,Struct不需要
MyClass aClassObj; // MyClass aClassObj=new MyClass(); is the correct format.aClassObj.
myVar=100;//NullReferenceException(because aClassObj does not contain a reference to an object of type myClass).
MyStruct aStructObj;
aStructObj.myVar=100; // no exception.
8,class支持继承和多态,Struct不支持. 注意:但是Struct 可以和类一样实现接口
9,既然Struct不支持继承,其成员不能以protected 或Protected Internal 修饰
10,Class的构造器不需要初始化全部字段,Struct的构造器必须初始化所有字段
class MyClass //No error( No matter whether the Field ' MyClass.myString ' is initialized or not ).
int myInt;
string myString;
public MyClass( int aInt )
myInt = aInt;
struct MyStruct // Error ( Field ' MyStruct.myString ' must be fully assigned before it leaves the constructor ).
int myInt;
string myString;
public MyStruct( int aInt )
myInt = aInt;
11,Class可以定义析构器,但是Struct不可以
12,Class比较适合大的和复杂的数据,Struct适用于作为经常使用的一些数据组合成的新类型。
适用场合:Struct有性能优势,Class有面向对象的扩展优势。
用于底层数据存储的类型设计为Struct类型,将用于定义应用程序行为的类型设计为Class。如果对类型将来的应用情况不能确定,应该使用Class。 参考技术A 调用的样式名 其实就是style=""的东西
小例子
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
<style type="text/css">
.t1display:none;
</style>
</head>
<body onload="a()">
<form id="form1" runat="server">
<div>
<div id="md1" class="t1">aaa</div>
</tr>
</table>
</div>
</form> 参考技术B class 类 代码中 class A 定义一个A类
HTML 里面的 如一个button控件 在HTML里面的class就是 css样式表类,调用css文件里的类可以改变button大小 背景等 参考技术C c#中的class是定义类的关键字,
一楼说的是html中的class,那是引用样式的属性本回答被提问者采纳 参考技术D 一楼简直是瞎扯蛋!class是定义类的关键字!
PHP 中的 ::class 是啥?
【中文标题】PHP 中的 ::class 是啥?【英文标题】:What is ::class in PHP?PHP 中的 ::class 是什么? 【发布时间】:2015-08-26 12:29:23 【问题描述】:PHP 中的::class
表示法是什么?
由于语法的性质,快速的 Google 搜索不会返回任何内容。
冒号冒号类
使用这种表示法有什么好处?
protected $commands = [
\App\Console\Commands\Inspire::class,
];
【问题讨论】:
【参考方案1】:SomeClass::class
将返回 SomeClass
的完全限定名称,包括命名空间。此功能在 PHP 5.5 中实现。
文档:http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name
它非常有用有两个原因。
您不必再将类名存储在字符串中。因此,许多 IDE 在您重构代码时可以检索这些类名 您可以使用use
关键字来解析您的类,而无需编写完整的类名。
例如:
use \App\Console\Commands\Inspire;
//...
protected $commands = [
Inspire::class, // Equivalent to "App\Console\Commands\Inspire"
];
更新:
此功能对 Late Static Binding 也很有用。
您可以使用static::class
功能来获取父类中派生类的名称,而不是使用__CLASS__
魔术常量。例如:
class A
public function getClassName()
return __CLASS__;
public function getRealClassName()
return static::class;
class B extends A
$a = new A;
$b = new B;
echo $a->getClassName(); // A
echo $a->getRealClassName(); // A
echo $b->getClassName(); // A
echo $b->getRealClassName(); // B
【讨论】:
稍微更正:在第一个示例中,Inspire::class
等同于“App\Console\Commands\Inspire”,没有反斜杠前缀。
@FabienHaddadi :注意use \App\...
和use App\...
这两个符号是允许的。我用它来区分包含在子命名空间中的类和包含在当前命名空间层次结构之外的类。
一个警告,你可以输入任何东西,仍然得到一个“类”的名字。我可以键入 SomeDumbCrapThatDoesntExist::class,如果 IDE 没有捕获它,它不会给我错误或警告。很容易打错字而错过它。【参考方案2】:
class
比较特殊,是php提供的,用来获取全限定类名。
见http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name。
<?php
class foo
const test = 'foobar!';
echo foo::test; // print foobar!
【讨论】:
Laravel 决定改用它有什么原因吗? 它不是 Inspire 类的常量。它是 php 提供的常量。这是获取完全限定类名的快速方法。 php.net/manual/en/… @Yada 我相信 Laravel 使用它的原因是它让你少了一个打错字的地方。您可以使用字符串 '\App\Console\Commands\Inspire' 或 Inspire::class 来获得相同的结果,但您的 IDE 会捕获后者的语法/拼写错误,从而使其更易于调试。 这段代码和问题有什么关系?【参考方案3】:如果您好奇它属于哪个类别(是否是语言构造等),
这只是一个常数。
PHP 称它为“特殊常量”。它的特殊之处在于它是 PHP 在编译时提供的。
特殊的 ::class 常量自 PHP 5.5.0 起可用,并允许 对于编译时的完全限定类名解析,这是 对命名空间类有用:
https://www.php.net/manual/en/language.oop5.constants.php
【讨论】:
【参考方案4】:请注意使用以下内容:
if ($whatever instanceof static::class) ...
这将引发语法错误:
unexpected 'class' (T_CLASS), expecting variable (T_VARIABLE) or '$'
但您可以改为执行以下操作:
if ($whatever instanceof static) ...
或
$class = static::class;
if ($whatever instanceof $class) ...
【讨论】:
这个用于动态命名的 hack,来自 php 5.* 的工作方式类似于$className = 'SomeCLass'; $className = new $className(); $methodName = 'someMethod'; $className->$methodName($arg1, $arg2, $arg3); /* or if args can be random array*/ call_user_func_array([$className, $methodName], $arg);
以上是关于c#中的class是啥的主要内容,如果未能解决你的问题,请参考以下文章
实现 INotifyPropertyChanged 时,C# 中的 [NotifyPropertyChangedInvocator] 是啥?