ML 命名空间提供避免元素命名冲突的方法。
命名冲突
在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。
这个 XML 携带 HTML 表格的信息:
<table>
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
这个 XML 文档携带有关桌子的信息(一件家具):
<table>
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
假如这两个 XML 文档被一起使用,由于两个文档都包含带有不同内容和定义的 <table> 元素,就会发生命名冲突。
XML 解析器无法确定如何处理这类冲突。
使用前缀来避免命名冲突
在 XML 中的命名冲突可以通过使用名称前缀从而容易地避免。
该 XML 携带某个 HTML 表格和某件家具的信息:
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
在上面的实例中,不会有冲突,因为两个 <table> 元素有不同的名称。
XML 命名空间 - xmlns 属性
当在 XML 中使用前缀时,一个所谓的用于前缀的命名空间必须被定义。
命名空间是在元素的开始标签的 xmlns 属性中定义的。
命名空间声明的语法如下。xmlns:前缀="URI"。
<root>
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table xmlns:f="http://www.w3cschool.cc/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
在上面的实例中,<table> 标签的 xmlns 属性定义了 h: 和 f: 前缀的合格命名空间。
当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。
命名空间,可以在他们被使用的元素中或者在 XML 根元素中声明:
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3cschool.cc/furniture">
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
注释:命名空间 URI 不会被解析器用于查找信息。
其目的是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。
请访问 http://www.w3.org/TR/html4/。
统一资源标识符(URI,全称 Uniform Resource Identifier)
统一资源标识符(URI)是一串可以标识因特网资源的字符。
最常用的 URI 是用来标识因特网域名地址的统一资源定位器(URL)。另一个不那么常用的 URI 是统一资源命名(URN)。
在我们的实例中,我们仅使用 URL。
默认的命名空间
为元素定义默认的命名空间可以让我们省去在所有的子元素中使用前缀的工作。它的语法如下:
xmlns="namespaceURI"
这个 XML 携带 HTML 表格的信息:
<table xmlns="http://www.w3.org/TR/html4/">
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
这个XML携带有关一件家具的信息:
<table xmlns="http://www.w3schools.com/furniture">
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
实际使用中的命名空间
XSLT 是一种用于把 XML 文档转换为其他格式的 XML 语言,比如 HTML。
在下面的 XSLT 文档中,您可以看到,大多数的标签是 HTML 标签。
非 HTML 的标签都有前缀 xsl,并由此命名空间标识:xmlns:xsl="http://www.w3.org/1999/XSL/Transform":
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr>
<th align="left">Title</th>
<th align="left">Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
如您还有不明白的可以在下面与我留言或是与我探讨QQ群308855039,我们一起飞!
(1)https://blog.csdn.net/weixin_42565127/article/details/130927438
(2)https://www.runoob.com/csharp/csharp-namespace.html
(3)https://blog.csdn.net/wuqiang20081807/article/details/78470003
public、protected、private对应着类或成员的权限。
internal也是一各类型/成员修饰符(被修饰的类型或者成员称为内部类型或成员),只是它所修饰的类只能在同一个程序集中被访问,而同一个程序集表示同一个dll程序集或同一个exe程序集。
命名空间的设计目的是提供一种让一组名称与其他名称分隔开的方式。在一个命名空间中声明的类的名称与另一个命名空间中声明的相同的类的名称不冲突。
命名空间可以将不同的程序集(功能)隔离开来。
图片来源https://www.runoob.com/csharp/csharp-namespace.html
命名空间的定义是以关键字 namespace 开始,后跟命名空间的名称,如下所示:
namespace namespace_name
{
// 代码声明
}
为了调用支持命名空间版本的函数或变量,会把命名空间的名称置于前面,如下所示:
namespace_name.item_name;
(1)测试例子
namespace A_space
{
public class ChenSpaceTestClass1
{
public void Run()
{
Console.WriteLine("---ChenSpaceAClass1_Run--");
}
}
}
namespace B_space
{
//注意,故意同名了
public class ChenSpaceTestClass1
{
public void Run()
{
Console.WriteLine("---ChenSpaceBClass1_Run--");
}
}
}
class Demo
{
public static void Main()
{
A_space.ChenSpaceTestClass1 chenSpaceTestClass1_1=new A_space.ChenSpaceTestClass1();
chenSpaceTestClass1_1.Run();
B_space.ChenSpaceTestClass1 chenSpaceTestClass1_2=new B_space.ChenSpaceTestClass1();
chenSpaceTestClass1_2.Run();
}
}
(2)测试结果
使用 using 命名空间指令,这样在使用的时候就不用在前面加上命名空间名称。
(1)测试例子如下
using first_space;
using second_space;
namespace first_space
{
class abc
{
public void func()
{
Console.WriteLine("Inside first_space");
}
}
}
namespace second_space
{
class efg
{
public void func()
{
Console.WriteLine("Inside second_space");
}
}
}
class TestClass
{
static void Main()
{
abc fc=new abc();
efg sc=new efg();
fc.func();
sc.func();
}
}
(2)可以看出使用了相应的using后,abc和efg类都可以直接使用了
(3)测试结果
参考了https://blog.csdn.net/wuqiang20081807/article/details/78470003
(1)程序集可以理解成一个个不同的DLL
(2)程序集和命名空间不存在必然联系,一个程序集可以包含多个命名空间,同一个命名空间也可以分放在几个程序集。
(3)命名空间是逻辑上的组织单元,而程序集是物理上的组织单元。一个程序集可以包含多个命名空间,而一个命名空间也可以跨越多个程序集。程序集的名称通常包含其命名空间,以便于识别和管理。
在vs中一个项目会生成一个dll文件,因此这个dll或这个项目也就是一个程序集。比如下面的一个dll:
namespace Common
{
internal class A
{
public void aa()
{
}
}
public class B
{
public void bb()
{
//这样是正确的
A a=new A();
a.aa();
}
}
}
如果另一个项目TestWeb引用了4.1中的dll,即common.dll,即
using Common;
namespace TestWeb
{
public class Test
{
public void test_1()
{
//这样是出错的
A a=new A();
a.aa();
//这样是正确的
B b=new B();
b.bb();
}
}
}
一般一个成员或类型只能有一个访问修饰符,但使用protected internal组合时除外,它的访问仅限于从包含类派生的当前程序集或类型。即我们可以在本程序集中访问,也可以在其他程序集中继承访问。如下:
名空间
主要作用就是减少全局变量,避免变量之间的命名冲突,使全局空间最大化的整洁。
不使用命名空间模式的情况如下
function a(){}
function b(){}
var c=2;
var d=5;
var e={};
e.name="tina";
var f={};
以上有两个全局函数,两个全局对象,两个全局变量,这样无疑是有潜在风险的,比如无意中创建了一个与变量d同名的函数。
typeof d//"number"
function d(){alert(123)};
typeof d;//"function"变量d的数据类型和值被改变了。
这样的结果虽然可能是无意的,但却是很糟糕的。
改为命名空间模式如下:
var MYNP={};
MYNP.a=function(){};
MYNP.b=function(){};
MYNP.c=2;
MYNP.d=5;
MYNP.e={};
MYNP.e.name="Tina";
MYNP.f={};
也可以简写为
var MYNP={
a:function(){},
b:function(){},
c:2,
d:5,
e:{name:"Tina"},
f:{}
}
function d(){};
typeof MYNP.d//"number"
typeof d//"function"
*请认真填写需求信息,我们会在24小时内与您取得联系。