C#关键字explicit、implicit、operator 、unsafe 、fixed

今天遇到一些一般不常用,但说不定什么情况下就能用到的C#关键字。

转换关键字

explicit 定义强制转换

// Must be defined inside a class called Fahrenheit:
public static explicit operator Celsius(Fahrenheit fahr)
{
return new Celsius((5.0f / 9.0f) * (fahr.degrees - 32));
}

implicit 定义隐性转换

// User-defined conversion from Digit to double
public static implicit operator double(Digit d)
{
return d.val;
}

operator 定义重载操作符号

详情MSDN: http://msdn.microsoft.com/zh-cn/library/39bb81c3.aspx


C#使用指针

unsafe 关键字表示不安全上下文,该上下文是任何涉及指针的操作所必需的。

fixed 语句禁止垃圾回收器重定位可移动的变量。 fixed 语句只在不安全的上下文中是允许的。 Fixed
还可用于创建固定大小缓冲区。


    // The unsafe keyword allows pointers to be used within
// the following method:
static unsafe void Copy(byte[] src, int srcIndex,
byte[] dst, int dstIndex, int count)
{
if (src == null || srcIndex < 0 ||
dst == null || dstIndex < 0 || count < 0)
{
throw new ArgumentException();
}
int srcLen = src.Length;
int dstLen = dst.Length;
if (srcLen - srcIndex < count ||
dstLen - dstIndex < count)
{
throw new ArgumentException();
}

// The following fixed statement pins the location of
// the src and dst objects in memory so that they will
// not be moved by garbage collection.
fixed (byte* pSrc = src, pDst = dst)
{
byte* ps = pSrc;
byte* pd = pDst;

// Loop over the count in blocks of 4 bytes, copying an
// integer (4 bytes) at a time:
for (int n = 0; n < count / 4; n++)
{
*((int*)pd) = *((int*)ps);
pd += 4;
ps += 4;
}

// Complete the copy by moving any bytes that weren‘t
// moved in blocks of 4:
for (int n = 0; n < count % 4; n++)
{
*pd = *ps;
pd++;
ps++;
}
}
}

static void Main(string[] args)
{
byte[] a = new byte[100];
byte[] b = new byte[100];
for (int i = 0; i < 100; ++i)
a[i] = (byte)i;
Copy(a, 0, b, 0, 100);
Console.WriteLine("The first 10 elements are:");
for (int i = 0; i < 10; ++i)
Console.Write(b[i] + " ");
Console.WriteLine("\n");
}

详情MSDN:

http://msdn.microsoft.com/zh-cn/library/chfa2zb8.aspx

http://msdn.microsoft.com/zh-cn/library/f58wzh21.aspx

C#关键字explicit、implicit、operator 、unsafe 、fixed

时间: 2024-10-09 12:29:44

C#关键字explicit、implicit、operator 、unsafe 、fixed的相关文章

类型转换关键字explicit与implicit的用法

这篇是个语法文,虽然这两个关键字比较陌生,但让自己有个印象不是坏事 explicit 明确转换与 implicit 隐含转换都是c#内的关键字,目的是让一个类型 转换到另外一个类型,最常见的例子就是由double转换到int时要使用明确转换, 而int转换到double的时候是使用隐含转换. double d = default(double); int i = default(int); //double 转换为 int 时必须明确定义类型 //否则编译器会丢出错误 i = (int)d; /

C# 关键字explicit(显示),implicit(隐式),类型的隐式和显式转换

class Program { static void Main(string[] args) { Adaptee ada = new Adaptee(); Target tar = ada; } } public class Adaptee { public int code = 1; } public class Target { private int data; public Target(int data) { this.data = data; } //可以进行隐式转换 public

c# 指针unsafe/fixed -- 【一】

指针C#unsafefixed 目录(?)[-] 概述 unsafe fixed 1.1 概述 unsafe关键字表示不安全上下文,该上下文是任何涉及指针的操作所必需的.可以在属性.方法.类的声明中使用unsafe修饰符,此时类型或成员的整个正文范围均被视为不安全上下文. fixed语句用于禁止垃圾回收器重定位可移动的变量,Fixed还可用于创建固定大小的缓冲区,fixed 语句只能出现在不安全的上下文中. 但在C#中使用指针时只能操作struct,不能操作class,不能在泛型类型代码中使用未

关键字explicit的作用(转)

C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式). 关于explicit关键字,先看看MSDN上的解释: This keyword is a declaration specifier that canonly be applied to in-class constructor declarations. An

Qt C++中的关键字explicit——防止隐式转换(也就是Java里的装箱),必须写清楚

最近在复习QT,准备做项目了,QT Creator 默认生成的代码 explicit Dialog(QWidget *parent = 0)中,有这么一个关键字explicit,用来修饰构造函数.以前在Windows下写程序的时候,基本上没有碰到这个关键字,那么这个关键字是做什么用的呢? 关键字 explicit 可以禁止“单参数构造函数”被用于自动类型转换,主要用于 "修饰 "构造函数. 指明构造函数只能显示使用,目的是为了防止不必要的隐式转化. 光看这一句似乎不太容易明白,下面,举

unsafe,fixed与GCHandle

1.unsafe 为了保持类型安全,默认情况下,C# 不支持指针运算. 在公共语言运行库 (CLR) 中,不安全代码是指无法验证的代码.C# 中的不安全代码不一定是危险的,只是其安全性无法由 CLR 进行验证的代码.因此,CLR 只对在完全受信任的程序集中的不安全代码执行操作.如果使用不安全代码,由您负责确保您的代码不会引起安全风险或指针错误. unsafe 关键字表示不安全上下文,该上下文是任何涉及指针的操作所必需的. 可以在 类型或成员,块内 声明中使用 unsafe 修饰符 若要编译不安全

语言基础(6):关键字explicit

C++中 explicit 被用来修饰只有一个参数的构造函数,作用是调用该构造函数必须是显示的, 跟它相对应的单词是 implicit(隐含的.不言明的),类构造函数默认情况下即声明为 implicit (因此C++没有此关键字). 如果不使用该关键字,调用只有一个参数的构造函数允许通过缺省的转换操作完成,过程分为两步: 将该构造函数参数对应数据类型的数据转换为该类对象: 然后调用复制构造函数来实现构造对象: 通过一个例子来说明 explicit 作用: class String{ ??????

关键字explicit

explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生.声明为explicit的构造函数不能在隐式转换中使用. class A { public: A(int x) { } }; class B { public: explicit B(int x) { } }; A a = 5;//OK隐式调用 A a1(5);//OK 显式调用 B b = 5;//ERROR B b1(5);/OK

关键字 explicit

C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色. 1 是个构造器 ,2 是个默认且隐含的类型转换操作符. 所以, 有时候在我们写下如 AAA = XXX, 这样的代码, 且恰好XXX的类型正好是AAA单参数构造器的参数类型, 这时候编译器就自动调用这个构造器, 创建一个AAA的对象. 这样看起来好象很酷, 很方便. 但在某些情况下(见下面权威的例子), 却违背了我们(程序员)的本意. 这时候就要在这个构造器前面加上explicit修饰,