在命名空间下定义类型

如果定义的类型要用于其他.NET 语言,应该把它们放在命名空间下,而不是模块中。这是因为模块在被编译成 C# 或其他.NET 语言时,被处理成类,在模块中定义的任何类型都成为这个类型内部的类。虽然对于 C# 来说,这并不是什么大问题,但是,如果用命名空间代替模块,C# 客户端代码看起来会更清晰。这是因为在 C# 中,只用using 语句导入(open)命名空间,而如果是在模块中的类型,在 C# 中使用时,就必须把模块名作为前缀。

让我们看一下这样的例子。下面的例子定义了类TheClass,它是在命名空间下;随类一起还提供几个函数,但不能直接放在命名空间下,因为,值不能在命名空间中定义。这里,定义了一个名字叫TheModule 模块,来管理函数值。

namespace Strangelights

open System.Collections.Generic

// this is a counterclass

type TheClass(i)
=

let mutable theField = i

member x.TheField

with get() =theField

// increments the counter

member x.Increment() =

theField <- theField
+ 1

// decrements the count

member x.Decrement() =

theField <- theField
- 1

// this is a module forworking with the TheClass

module TheModule = begin

// increments a list of TheClass

let incList (theClasses: List<TheClass>)
=

theClasses |> Seq.iter
(fun c ->c.Increment())

// decrements a list of TheClass

let decList (theClasses: List<TheClass>)
=

theClasses |> Seq.iter
(fun c ->c.Decrement())

end

在 C# 中使用TheClass 类,现在就很简单了,因为不必要加前缀,也可以很容易地访问到TheModule 中的相关函数:

// !!! C# Source !!!

usingSystem;

usingSystem.Collections.Generic;

usingStrangelights;

classProgram {

static
voidUseTheClass() {

// create a list of classes

List<TheClass> theClasses = newList<TheClass>() {

new TheClass(5),

new TheClass(6),

new TheClass(7)};

// increment the list

TheModule.incList(theClasses);

// write out each value in the list

foreach (TheClass c
in theClasses) {

Console.WriteLine(c.TheField);

}

}

static
voidMain(string[] args) {

UseTheClass();

}

}

在命名空间下定义类型

时间: 2024-10-11 17:54:31

在命名空间下定义类型的相关文章

命名空间的定义

命名空间是一个容器,这个容器主要是为了识别其下的类和函数.一旦定义了命名空间,它下面的代码就属于这个命名空间了,所以命名空间的定义要在代码的最开始行. 对于同一个包来说,同一个命名空间或者子命名空间的代码没有必要在一个 PHP 文件中定义,子命名空间下的代码是为了完成特定模块的工作,组合起来就是一个包完整的命名空间. 假如编写的代码没有定义命名空间,那说明它属于全局的命名空间(\ 符号),所以能够直接引用类或者函数(不用添加 \ 符号).

未能在全局命名空间中找到类型或命名空间名称“Wuqi”

下载了AspNetPager控件用以进行分页操作,在项目中放入控件后,运行报错:未能在全局命名空间中找到类型或命名空间名称“Wuqi” . 解决办法:在项目下拉框“引用“中添加AspNetPager引用即可 未能在全局命名空间中找到类型或命名空间名称"Wuqi"

【c++ primer】【18.2.1】命名空间的定义

一个命名空间包含两部分:首先是关键字namespace,随后是命名空间的名字.在命名空间名字后面是一系列由花括号括起来的声明和定义.只要能出现在全局作用域中的声明就能置于命名空间内,主要包括:类.变量(及其初始化操作).函数(及其定义).模板及其它命名空间: namespace cplusplus_primer { class Sales_data {/* ... */}; Sales_data operator+(const Sales_data&, const Sales_data &

第37条:用标记接口定义类型

标记接口是没有包含方法声明的接口,而只是指明一个类实现了具有某种属性的接口.考虑Serializable接口,通过实现这个接口,类表明它的实例可以被写到ObjectOutputStream. 标记接口相比标记注解的优点: 1.标记接口定义的类型是由被标记类的实例实现的:标记注解则没有定义这样的类型. 2. 可以被更精确地进行锁定.如果注解类型利用@Target(ElementType.TYPE)声明,它就可以被应用到任何类或者接口,假设有一个标记只是适用于特殊的接口实现,但它却可以被应用到类,如

partial修饰符,可以让同类命名空间下出现重名

public partial class Person { } public partial class Person { } partial修饰符,可以让同类命名空间下出现重名,两个类其实是一个类,用于多人协做时,类名的重复

JavaScript函数命名空间、参数类型重载实现

有时候使用doFunc({arg1: xxx, arg2:xxx});不方便,还是得在参数表重载,而重载情况又多种多样弄得晕头转向,结果就试着写了这么个东西,也不知道有没有地方能用上: <!DOCTYPE html> <html lang="zh"> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

Linux复制指定目录及子目录下特定类型的文件

主要参考这个: http://www.2cto.com/os/201208/144996.html 拷贝一些内容就是: 首先建立一个用于测试的目录 可见,目录中主要包含用于测试的*.txt文件和用于充当炮灰的*.tes文件 目标是保持当前的目录结构,只把txt文件复制出来 方法一:当不需要的文件类型较为单一时,可以通过完全复制然后删除指定类型的文件完成 Step1 使用命令 cp -r test/ test2 将测试目录test下所有内容完全复制到test2. Step2 组合使用find及xa

结构体、共用体和用户定义类型(1)

C语言的基本类型有:整型(int).字符型(char).浮点型(float).双精度型(double).空值型(void)以及派生类型 (指针和数组).本章介绍C语言中可由用户构造的三种数据类型: (1)用户定义类型(typedef):(2)结构体(struct):(3)共用体(union): 1 用typedef说明新类型名 C语言允许用 typedef 说明一种新类型名,一般形式为: typedef 类型名 标识符: “类型名”必须是在此语句前已有定义的类型标识符.“标识符”是一个用户定义标

MySQL学习笔记(6)之数据定义类型

数据定义类型总汇 1.整数型: 整数类型 字节 有符号范围 无符号范围 用途 tinyint 1 (-128,127) (0,255) 小整数 smallint 2 (-32 768,32 767) (0,65 535) 大整数 mediumint 3 (-8 388 608,8 388 607) (0,16 777 215) 大整数 int或integer 4 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 超大整数 bigint 8 (-9