读书人

C#进阶者对例子里面的几个疑问?该如

发布时间: 2012-03-01 10:25:47 作者: rapoo

C#进阶者对例子里面的几个疑问?
各位朋友,代码如何,下面是小弟的几个问题,请各位朋友可以耐心赐教,谢谢!!!

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
class Address
{
public string name;
public string address;
}
class Methodparams
{
public static void Main()
{
string myChoice;
Methodparams mp = new Methodparams();
//。。。。。。。。
}
void makeDecision(string myChoice)
{
Address addr = new Address();
switch (myChoice)
{
case "A ":
case "a ":
{
addr.name = "Joe ";
addr.address = "C# Station ";
this.addAddress(ref addr);//问题1:这里是调用一个实例方法,是进行地址传递,里面的参数ADDR是一个什么东西,能不能详细具体一点?
break;
}

}

}
void addAddress(ref Address addr)//问题2:REF里面的参数正常来说是这样定义的:REF 数据类型 名称,但这里面的数据类型却是一个类,为什么可以这样用?不是很明白,请讲解一下?
{


Console.WriteLine( "Name:{0},Address:{1} added. ", addr.name, addr.address);
}
void modifyAddress(out Address addr)
{
addr = new Address();//问题3:这句其实是不是定义一个实例的,为什么可以这样写?自己认为应该是这样写的: address addr=new address()
addr.name = "Joe ";
addr.address = "C# Station ";
}

}

}

[解决办法]
1 ADDR应该是对象名
2 不明白 关注中
3 addr = new Address()可以这样写 原因是addr 已经 "定义 "了 但没有生成 addr = new Address() 是生成对象的意思 address addr=new address()是定义和生成写一起了
[解决办法]
关注中顶一下
[解决办法]
up
[解决办法]
void makeDecision(string myChoice)
{
Address addr = new Address(); //看清楚,lz的1、3问题都是因为忽视了这句

问题1 参数addr 就是上面的addr对象
问题2 这是定义子函数,不是调用,当然要指定类型。
定义一个方法,add(int i),难道这个int你能不写吗??
问题3 addr已经定义过了,只需重新实例化便可
[解决办法]
问题1: addr实际上是指针的指针,address是一个指向字符串的指针,addr是一个指向address的指针, addr-> address-> 字符串内容

问题2:类也是数据类型,类其实是现代程序里面最重要的数据类型

问题3: addr是在函数的参数列表里被定义过的变量呀
[解决办法]
记号
[解决办法]
学习
[解决办法]
即使是引用类型,在方法中传递的也是引用地址的副本,这一点在VB.NET中就很明显了,因为它的每个方法默认的参数都是Byval传递的。你这里在方法中用的是引用副本,虽然和方法外的引用都指向同一个对象,但改变副本的指向并不影响方法外面的引用。说白了就是所有的方法参数,如果不指定ref或者out,那就是按副本传递的。引用型传递的是地址的副本,值类型传递的是值的副本。
[解决办法]
1 对象的地址
2 表示需要一个参数 类型必须是Address 并且引用传递
3 addr = new Address()没错

建议看看最基础的编程书籍吧 先看C 再看C# 要不然会被C#一些花里胡哨的东西搞晕
[解决办法]
问题1: addr实际上是指针的指针,address是一个指向字符串的指针,addr是一个指向address的指针, addr-> address-> 字符串内容

正解,addr是一个指针
就像 C++中的 &号 取引用

问题2:类也是数据类型,类其实是现代程序里面最重要的数据类型

正解
ref 数据类型 名称
里面可以是类 结构 还有原子数据类型都可以

问题3: addr是在函数的参数列表里被定义过的变量呀

out Address addr
表示带出数据类型
addr已经定义
所以可以这样定义

[解决办法]
另外
一定要注意基础的学习
否则 空中楼阁
[解决办法]
this.addAddress(ref addr);//问题1:这里是调用一个实例方法,是进行地址传递,里面的参数ADDR是一个什么东西,能不能详细具体一点?
addr是指向托管堆里对象的引用

void addAddress(ref Address addr)//问题2:REF里面的参数正常来说是这样定义的:REF 数据类型 名称,但这里面的数据类型却是一个类,为什么可以这样用?不是很明白,请讲解一下?

类就是一种数据类型,就是因为简单的数据类型不能表达我们对客观世界的描述,所以我们才需要类(其实就是自定义的复杂数据类型)



void modifyAddress(out Address addr)
{
addr = new Address();//问题3:这句其实是不是定义一个实例的,为什么可以这样写?自己认为应该是这样写的: address addr=new address()
//这个addr就是void modifyAddress(out Address addr)里传进来的这个输出参数的addr,如果你自己再写个address addr=new address(),那么就是一个新的addr,并不能改变传进来的addr所指向的对象的内容了,再说输出参数本来就应该在方法的内部赋值
addr.name = "Joe ";
addr.address = "C# Station ";
}

[解决办法]
其实lz好好的看看值类型和实例化类的问题,就明白这样写是可以的了
[解决办法]
同意
LifeForCode(用生命编程.再入轮回(2007)) ( ) 信誉:100 2007-08-17 11:15:42 得分: 0


void makeDecision(string myChoice)
{
Address addr = new Address(); //看清楚,lz的1、3问题都是因为忽视了这句

问题1 参数addr 就是上面的addr对象
问题2 这是定义子函数,不是调用,当然要指定类型。
定义一个方法,add(int i),难道这个int你能不写吗??
问题3 addr已经定义过了,只需重新实例化便可



[解决办法]
原来这就叫进阶了……
[解决办法]
呵呵,看到了大家从不同层次和角度给lz的解释
lz估计晕菜了,3年后再看这贴都有收获

读书人网 >C#

热点推荐