对象初始化的问题

houzhihoujue90 2010-03-29 09:50:30
新手学c#,下面的代码在vs2005中编译不能通过,但是代码是从出版社下载的,不知道是怎么回事,麻烦看看。
public class Point
{
public int X = 1;
public int Y = 2;
}

class Program
{
static void Main()
{
Point pt1 = new Point();
Point pt2 = new Point { X = 5,Y = 6};//此处报错

Console.WriteLine( "pt1: {0}, {1}", pt1.X, pt1.Y );
Console.WriteLine( "pt2: {0}, {1}", pt2.X, pt2.Y );
Console.ReadKey();
}
}
}
...全文
211 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
danier9687 2010-04-08
  • 打赏
  • 举报
回复
C#3.0中的新特性,对象初始化器。
在网上搜索到一篇叫做<C#3.0新特性欣赏>如下:
以下总结内容归纳自《你必须知道的.NET》

C#3.0带来了超强的编程体验,一系列的语言特性让C#充满了新的活力,代码更加简洁、干净,富有表达含义。
正是这些新特性给LINQ技术的引入做好了铺垫,值得注意的是这些新特性只是编译器对C#语言的修改。
1.1对象初始化器(Object Initializers)
对象初始化是构造器的专职工作,有时候对于没有在构造器中完成初始化的成员,可以通过赋值的方式来完成,
而对象初始化器就是用来完成这项工作的便捷操作。
1. 2.0初始化方式
User user =new User();
user.Name = "张三";
user.Age = 25;
2. 3.0初始化方式
User user = new User{Name ="张三",Age=25};
相比之下3.0的方式要简洁优美很多。Visual Studio 2008 的智能感知能够自动识别成员,在初始化器进行初
始化时没有顺序要求,也没有初始化所有类成员的要求,一起根据需要进行初始化选择。
1.2集合初始化器(Collection Initializers)
1. 2.0初始化方式
public static void Main()
{
List<User> users =new List<User>();
users.Add(new User{Name ="张三",Age=25});//使用了对象初始化器
users.Add(new User{Name ="李四",Age=20});
}
2. 3.0初始化方式
public static void Main()
{
List<User> users =new List<User>{
new User{Name ="张三",Age=25},
new User{Name ="李四",Age=20}
};
}
1.3自动属性(Automatic Properties)
自动属性用于完成对属性语法的简洁化操作,通过以下下类比你将会发现自动属性的优越性。
1. 2.0方式
class User
{
private string name;
private Int32 age;
//定义只读属性
public string Name
{
get { return name;}
}

public Int32 Age
{
get { return age;}
set { age =value;}
}

}
2. 3.0方式
class User
{
public string Name {get;private set;}//只读属性需要在set访问器前加上private修饰符
public Int32 Age {get;set;}
}
注意:
(a)对于需要附加逻辑的字段,自动属性无法完成,必须使用传统方式实现,比如要对User类
中age字段的set访问器添加约束,
public Int32 Age
{
get{return age;}
set
{
if((value >0) && (value <100))
{
age =value;
}
else
{
throw new ArgumentOutOfRangeException("年龄不合法");
}
}
}
(b)3.0方式必须同时实现get和set,对于只读或只写属性,需要为其访问器添加private访问修饰符.
(c)要区分和抽象属性(abstract property)的区别,例如:
abstract class User
{
//定义自动属性
public string Name{get;set;}
//定义抽象属性
abstract public Int32 Age{ get;}
}
1.4 隐式类型变量(Implicitly Typed Local Vaiables) 和隐式类型数组(Implicitly Typed Array)
C#3.0中引入了var关键字,用于定义隐式类型变量或隐式类型数组,例如:
public static Main()
{
//定义基员类型
var i=100;
var str ="Hello World.";
//定义数组类型
var arr =new[]{"张三","李四","王五"}
//定义自定义类型
var user =new User{Name="张三",Age=20};
}
提示:
(a)编译器在使用隐式类型时,将根据其值的类型来反推出变量本身的类型,然后将类型的声明由编
译器自动完成,所以在使用隐式类型变量时必须进行初始化,不能为null,或类型不定的表达式。
(b)用var来声明变量,编译时会根据值的类型确定变量的类型,所以不存在类型转换和装箱操作。
(c)隐式类型仍然为强类型,只是类型的声明由编译器完成。
1.5匿名类型(Anonymous Type)
匿名类型,通过隐式类型、对象初始化器来构建一个类型未知的对象,并以内联方式来定义对象的数
结构,所以匿名类型实现了在不定义类型的前提下实现对象的创建。
1. 非匿名类型方式
User user = new User{Name ="张三", Age=20};
2. 匿名类型方式
var user =new {Name="张三", Age=20};
提示:
(a)var定义了一个隐身类型变量,变量类型由它的值来决定,就是说右侧的数据结构能够返回一个具体
类型,这些都由编译器完成。
(b)对于匿名类型,c#3.0规定对象初始化器中的参数名称、类型和顺序都一致时,这些匿名类型的对象
视为同一种类型。
1.6扩展方法(Extension Methods)
扩展方法实现了在保持原有类型不做任何改变的情况下,对其进行扩展。这种扩展可以是同一程序集内
的方法扩展,也可以是不同程序集的方法扩展。扩展方法大大提高了系统设计的灵活度,按照开放封闭的
原则考虑,这种扩展机制实现了更加柔性的处理机制,你可以很容易实现对第三方程序集的扩展,很容易
为已经设计完成的系统创建新的功能点,很容易解决一发布程序集的扩展要求。因此,扩展方法不仅是LINQ
实现的基础之一,同时也提供了颇具创意的扩展机制,以下举一简单实例加以说明:
static class MyExtensions
{
//扩展自定义类型 (该方法在原始类中不存在)
public static void ShowInfo(this User user)
{
Console.WriteLins("Name: {0}\nAge: {1}",user.Name,user.Age);
}

//扩展String的方法,对已有程序集的扩展
public static void TellType(this string str)
{
Console.WriteLine("我是字符串:{0}",str);
}

}

在客户端,可以像调用实例方法一样调用扩展方法,如下:
public static void Main()
{
User user=new User{Name="张三",Age=20};
//调用扩展方法
user.ShowInfo();
string str="123456";
//调用扩展方法
str.TellType();
}
提示:
(a)必须以this关键字标记扩展方法的第一个参数,且该参数不能为指针类型;
(b)实例方法优先于扩展方法,命名空间内声明的扩展方法优先于命名空间外声明的扩展方法;
(c)扩展方法可以继承;
(d)扩展是只支持方法的扩展,不支持属性、事件的扩展;
(e)扩展方法是LINQ实现的基本条件,LINQ中所有查询操作符都是由扩展方法来定义的。
鸭梨山大帝 2010-03-29
  • 打赏
  • 举报
回复
升级到VS2008
houzhihoujue90 2010-03-29
  • 打赏
  • 举报
回复
谢谢!可惜已经结过贴,否则可以给你一些分,呵呵[Quote=引用 12 楼 ttxx12345678 的回复:]
语法没有问题,VS2008下可以正常运行,VS2005默认不带有C#3.0,
VS 2005 extensions for .NET Framework 3.0 - 简体中文
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=5d61409e-1fa3-48cf-8023-e8f38e7……
[/Quote]
a569673493 2010-03-29
  • 打赏
  • 举报
回复
少个构造函数
public Point(int x,int y)
{
this.x=x;
this.y=y;
}

而且你在实例化pt2对象的时候是错的吧 这样写pt2=new point(5,6);
ttxx12345678 2010-03-29
  • 打赏
  • 举报
回复
语法没有问题,VS2008下可以正常运行,VS2005默认不带有C#3.0,
VS 2005 extensions for .NET Framework 3.0 - 简体中文
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=5d61409e-1fa3-48cf-8023-e8f38e709ba6

这个链接下可能会对你在VS2005下使用C#3.0有所帮助
houzhihoujue90 2010-03-29
  • 打赏
  • 举报
回复
百度了一下,原来2008才可以,学习了,谢谢![Quote=引用 9 楼 amandag 的回复:]
这个是 C# 3.0的语法

楼主跑在VS 2005下当然不行
[/Quote]
wuyq11 2010-03-29
  • 打赏
  • 举报
回复
Point pt1 = new Point();
pt1.X=1;
对象初始化器
C# 3.0特性
amandag 2010-03-29
  • 打赏
  • 举报
回复
这个是 C# 3.0的语法

楼主跑在VS 2005下当然不行
深海之蓝 2010-03-29
  • 打赏
  • 举报
回复
就是对类中的两个属性赋值,怎么赋值都可以
houzhihoujue90 2010-03-29
  • 打赏
  • 举报
回复
莫非是我vs2005有问题?[Quote=引用 5 楼 majun01 的回复:]
语法没问题。VS2008下可以运行。
[/Quote]
ll869131394 2010-03-29
  • 打赏
  • 举报
回复
这么高明啊,还有这招
majun01 2010-03-29
  • 打赏
  • 举报
回复
语法没问题。VS2008下可以运行。
guanmingle 2010-03-29
  • 打赏
  • 举报
回复
  Point pt1 = new Point(5, 6);
Console.WriteLine( "pt1: {0}, {1}", pt1.X, pt1.Y );
houzhihoujue90 2010-03-29
  • 打赏
  • 举报
回复
这个是书上的,“对象初始化列表”。
以下是在网上搜到的:
在C#2.0中,我们是这样声明变量并赋值的:

Studentstu=newStudent();
stu.StuName="Brian";
stu.StuAge="21";
stu.StuClass="1班";
而在C#3.0中,我们可以这样C#初始化对象:

Studentstu2=newStudent
{ StuName="Brian", StuAge="21", StuClass="1班" }
[Quote=引用 1 楼 wangxianshou 的回复:]
Point pt2 = new Point { X = 5,Y = 6};//此处报错

没有这种语法吧
Point pt2 = new Point();
pt2.X=5;
pt2.Y=6;

或者是重新写一个构造函数
[/Quote]
wangxianshou 2010-03-29
  • 打赏
  • 举报
回复
Point pt2 = new Point { X = 5,Y = 6};//此处报错

没有这种语法吧
Point pt2 = new Point();
pt2.X=5;
pt2.Y=6;

或者是重新写一个构造函数

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧