索引编译
⑴ c#索引器的用法,初学索引器,原理都不懂..
class SampleCollection<T>
{
private T[] arr = new T[100];
public T this[int i]
{
get
{
return arr[i];
}
set
{
arr[i] = value;
}
}
}
// This class shows how client code uses the indexer
class Program
{
static void Main(string[] args)
{
SampleCollection<string> stringCollection = new SampleCollection<string>();
stringCollection[0] = "Hello, World";
System.Console.WriteLine(stringCollection[0]);
}
}
索引器使得对象可按照与数组相似的方法进行索引。
get 访问器返回值。set 访问器分配值。
this 关键字用于定义索引器。
value 关键字用于定义由 set 索引器分配的值。
索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。
索引器可被重载。
索引器可以有多个形参,例如当访问二维数组时。
补充问题的回答:
c#中编译器会定义一个把所有的数据成员初始化成0(假、null)等的构造函数,这个默认构造函数确保了结构体在生成时被初始化。
而如果允许你自己定义默认构造函数,那么就存在着一种可能:你漏掉了某个成员没有初始化。这样一来会导致这个成员的值在被构造后处于未知的状态,这是C#所不允许的。
⑵ 谁知道C#中什么是索引器,索引器的实现过程,是否只能根据数字进行索引
C#语言一个最令人感兴趣的地方就是类的索引器(indexer)。简单说来,所谓索引器就是一类特殊的属性,通过它们你就可以像引用数组一样引用自己的类。显然,这一功能在创建集合类的场合特别有用,而在其他某些情况下,比如处理大型文件或者抽象某些有限资源等,能让类具有类似数组的行为当然也是非常有用的。本文就会引领你设置类来采用索引器。但是,首先让我们概述下属性这个概念以便了解些必要的背景知识。
属性
假如你曾经用VB6编写过程序,那么你应该很熟悉属性方法才对,所谓属性方法其实就是特殊的类成员,它实现了对私有类域的受控访问。在C#语言中有两种属性方法,其一是get,通过它可以返回私有域的值,其二是set,通过它就可以设置私有域的值。比如说,以下面的代码为例,其间创建了一个FirstName 属性,由它控制对私有类成员firstname的访问:class Person {
private string firstname;
public string FirstName {
get {return firstname;}
set {firstname = value;}
}
}
属性声明可以如下编码:
Person p = new Person();
p.FirstName = "Lamont";
Console.WriteLine (p.FirstName);
如你你所看到的那样,属性声明倒更像是域声明,只不过它还声明了两个特殊的成员,按照微软的说法就是所谓的访问函数(accessor)。当某一表达式的右边调用属性或者属性用作其他子程序(或者函数)的参数时即会调用get访问函数。反之,当表达式左边调用属性并且通过隐式传递value参数设置私有域值的情况下就会调用set访问函数。你可以创建只读属性,方法是省略set访问函数,这样任何设置属性的尝试都会产生编译错误。
采用索引器的益处 下面是它的结构 <modifier> <return type> this [argument list]
...{
get
...{
// Get codes goes here
}
set
...{
// Set codes goes here
}
}
注: modifier:修饰词,如private, public, protected or internal this:在C#中this是一个特殊的关键字,它表示引用类的当前实例。在这里它的意思是当前类的索引。 argument list:这里指索引器的参数。 说了半天咱们转到正题上来,那么为什么我要兜这个圈子呢?其实,这是因为类的索引器非常像属性,从代码上看也是这样。以下是具有索引器的类示例,通过索引器会返回一个字符串:class Sample {
public string this [int index] {
get {return "You passed " + index; }
}
}
注意,这里的属性名是this,意思是回引类的当前实例,参数列表包含在方括号而非括号之内。还有,这是一个只读索引器。为了把它改成读/写类型,我又添加了一个set访问函数。在定义索引器的时候,你不一定只采用一个参数。索引器参数可以采用任何类型,不过int是通常采用也是最为合理的类型。同一类中还可能拥有一个以上的索引器(重载)。
如上定义了Sample类之后,我们就可以把索引器用作某种默认的属性,如下所示:Sample s = new Sample();
Console.WriteLine(s[55]);
属性和索引器
属性和索引器之间有好些差别:
类的每一个属性都必须拥有唯一的名称,而类里定义的每一个索引器都必须拥有唯一的签名(signature)或者参数列表(这样就可以实现索引器重载)。
属性可以是static(静态的)而索引器则必须是实例成员。
为索引器定义的访问函数可以访问传递给索引器的参数,而属性访问函数则没有参数。
接口
类似数组的行为常受到程序实现者的喜爱,所以你还可以为接口定义索引器,IList和 IDictionary集合接口都声明了索引器以便访问其存储的项目。
在为接口声明索引器的时候,记住声明只是表示索引器的存在。你只需要提供恰当的访问函数即可,不必包括范围修饰符。以下代码把索引器声明为接口IImplementMe的一部分:interface IImplementMe {
string this[int index]
{
get;
set;
}
相应实现的类则必须为IimplementMe的索引器具体定义get和set访问函数。
以上就是有关索引器的一些基本概述了。现在你应该对索引器在你的开发中所具有的作用有了较深入的了解。class SampleCollection<T>
{
private T[] arr = new T[100];
public T this[int i]
{
get
{
return arr[i];
}
set
{
arr[i] = value;
}
}
}// This class shows how client code uses the indexer
class Program
{
static void Main(string[] args)
{
SampleCollection<string> stringCollection = new SampleCollection<string>();
stringCollection[0] = "Hello, World";
System.Console.WriteLine(stringCollection[0]);
}
}
⑶ 电视机左上角出现索引编译时间等怎么消除
这个是进入了系统总线,可能是存储器数据错乱或是遥控器乱按巧合按到了。退出总线系统,要电视机型号。
⑷ c# 初次学索引器求解问题 关于索引器和return和get。
很简单,就是有个路径没返回值
else if(index > 2 && index < 0)
{
throw new Exception("超出范围:");
}
这句后面,加上 throw new Exception("超出范围:");即可。
而且这句index > 2 && index < 0也不可能成立,应该改成
index > 2 || index < 0
⑸ C#中,索引器的作用和用法
实例+索引的方法来访问类成员。
using System;
class MyTest
{
public static int Main()
{
SchoolMate myMate=new SchoolMate();
Console.WriteLine(myMate.linkman[0]); //直接访问成员
//以索引器的形式访问成员
Console.WriteLine("name:{0}",myMate[0]);
Console.WriteLine("Enter your name:");
myMate[0]=Console.ReadLine();
Console.WriteLine("name:{0}",myMate[0]);
Console.WriteLine("sex:{0}",myMate[1]);
Console.WriteLine("age:{0}",myMate[2]);
return 0;
}
}
class SchoolMate
{
public string[] linkman;
public SchoolMate()
{
linkman=new string[]{"yesline","male","23"};
}
public string this[int index]
//string指返回值,this指类,或此类创建的实例。
{
get
{
return linkman[index];
}
set
{
linkman[index]=value;
}
}
}
在此成员中,访问linkman数组当然可以用另外的方法,如访问第一个成员:myMate.linkman[0]。
既然可以这样,为什么要用索引器呢?书上说当类是容器时用索引器有用,可我还没看到此类例子。
可以重载索引器。如再定义一个索引器:
public int othertest=23;
//定义
public int this[string index] //index的类型不能在为int,因为已定义过
{
get{return othertest;}
set{othertest=value;}
}
//使用,查看结果:
Console.WriteLine(myMate["1"]);
//myMate[""]中所以可以为任意string
//输出:23
⑹ c#中索引是怎么回事(尽量具体点)
索引器非常类似于属性,但索引器可以有参数列表,且只能作用在实例对象上,不能在类上直接作用
下面是一个索引器的具体的应用例子,它对我们理解索引器的设计和应用很有帮助。
using System;
class BitArray
{
int[] bits;
int length;
public BitArray(int length)
{
if (length < 0)
throw new ArgumentException();
bits = new int[((length - 1) > > 5) + 1];
this.length = length;
}
public int Length
{
get { return length; }
}
public bool this[int index]
{
get
{
if (index < 0 || index > = length)
throw new IndexOutOfRangeException();
else
return (bits[index > > 5] & 1 < < index) != 0;
}
set
{
if (index < 0 || index > = length)
throw new IndexOutOfRangeException();
else if(value)
bits[index > > 5] |= 1 < < index;
else
bits[index > > 5] &= ~(1 < < index);
}
}
}
class Test
{
static void Main()
{
BitArray Bits=new BitArray(10);
for(int i=0;i <10;i++)
Bits[i]=(i%2)==0;
Console.Write(Bits[i]+ " ");
}
}
编译并运行程序可以得到下面的输出:
True False True False True False True False True False
上面的程序通过索引器的使用为用户提供了一个界面友好的bool数组,同时又大大降低了程序的存储空间代价。索引器通常用于对象容器中为其内的对象提供友好的存取界面--这也是为什么C#将方法包装成索引器的原因所在。实际上,我们可以看到索引器在.NET Framework类库中有大量的应用。
出处:CSDN论坛
⑺ html help workshop编译时索引文件出错
有一个标签叫“Contents”就是制作索引用的,单击“添加关键字”(像钥匙一样的按钮),来添加一个关键字,在“URL”之中为此关键字指定 HTML 页面信息,然后可以单击箭头按钮来调整索引的优先级。
说得不太明白,没办法,不允许传图。
⑻ mysql有几种索引类型使用索引时都有那些地方要注意
MySQL索引类型包括:
一、普通索引
这是最基本的索引,它没有任何限制。有以下几种创建方式:
1.创建索引
代码如下:
CREATE INDEX indexName ON mytable(username(length));
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。
2.修改表结构
代码如下:
ALTER mytable ADD INDEX [indexName] ON (username(length)) -- 创建表的时候直接指定。
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );
-- 删除索引的语法:
DROP INDEX [indexName] ON mytable;
二、唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
代码如下:
CREATE UNIQUE INDEX indexName ON mytable(username(length))
-- 修改表结构
ALTER mytable ADD UNIQUE [indexName] ON (username(length))
-- 创建表的时候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
三、主键索引
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:
代码如下:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );
当然也可以用 ALTER 命令。记住:一个表只能有一个主键。
四、组合索引
为了形象地对比单列索引和组合索引,为表添加多个字段:
代码如下:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL, age INT NOT NULL );
为了进一步榨取MySQL的效率,就要考虑建立组合索引。
二:使用索引的注意事项
使用索引时,有以下一些技巧和注意事项:
1.索引不会包含有NULL值的列
只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
2.使用短索引
对串行进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
3.索引列排序
MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
4.like语句操作
一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
5.不要在列上进行运算
select * from users where YEAR(adddate)<2007;
将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成:
select * from users where adddate<‘2007-01-01';
6.不使用NOT IN和<>操作。
三:sql优化原则
常见的简化规则如下:
1.不要有超过5个以上的表连接(JOIN)
2.考虑使用临时表或表变量存放中间结果。
3.少用子查询
4.视图嵌套不要过深,一般视图嵌套不要超过2个为宜。
5.连接的表越多,其编译的时间和连接的开销也越大,性能越不好控制。
6.最好是把连接拆开成较小的几个部分逐个顺序执行。
7.优先执行那些能够大量减少结果的连接。
8.拆分的好处不仅仅是减少SQL Server优化的时间,更使得SQL语句能够以你可以预测的方式和顺序执行。
如果一定需要连接很多表才能得到数据,那么很可能意味着设计上的缺陷。
⑼ 易语言的多项选择命令的索引参数,为何换成变量就一直无法编译成功直接用1,2,3等等就可以了
1、“选择”和“多项选择”命令的各备选参数数据类型必须相同或可以互相转换。
2、之所以直接用数字能成功,是因为易语言直接根据这个数字选择了结果,在编译后的程序中不会再执行多项选择。
解决方法:所有参数都使用文本型。
⑽ 什么是索引表达式索引标识
索引表达式:按顺序由一个表达式、一个左括号、一个索引参数列表和一个右括号组成。表达式必须产生类型为数组的值、类型具有一组重载默认属性的值或一组重载属性。如果表达式的结果是重载属性或具有 Default 属性的值,则重载决策规则用于确定某个属性是否适用于索引参数列表。如果无任何属性适用,则发生编译时错误。否则将在带有索引参数的 getter 上执行函数成员调用,调用结果成为索引表达式的值。如果属性是只写的,则发生编译时错误。如果表达式的结果为数组类型的值,则参数列表中的参数数目必须同数组类型的秩相同,而且不能包含任何命名参数。每个表达式都必须可以隐式转换为 Integer 类型。索引表达式的值是指定索引处的变量。在运行时,参数列表先于表达式计算。如果运行时有任何索引无效,则引发 System.IndexOutOfRangeException 异常。IndexExpression ::= Expression ( ArgumentList )(索引表达式 ::= 表达式 ( 参数列表 ))索引标识:就是作为特殊标记。希望对你有帮助!