writelines()方法的参数可以是集合吗(C# void函数传入集合参数排序后没效果为什么)

本文目录
- C# void函数传入集合参数排序后没效果为什么
- List
和List<>为什么都可以做方法的参数 - java两个同名一样的,参数类型都是同样的集合类型,但泛型的元素类型不
- Python3 输入输出和File(文件) 方法
- 参数的取值范围能用集合表示吗
- Java 参数 可以是数组或者是集合如何做
- 写出java中定义方法的语法格式,并说明一个方法可以有多少个参数,多少个返回值
C# void函数传入集合参数排序后没效果为什么
先来说下C#中的数据类型.分值类型和引用类型两大类.
值类型:直接存储数据的值,保存在内存中的stack(堆栈)中
引用类型:存储对值的引用,实际上存储的就是一个内存的地址.引用类型的保存分成两块,实际值保存在托管堆(heap)中.实际值的内存地址保存在stack中
当使用引用类型时先找到stack中的地址,再找到heap中的实际值.
也就是说保存引用类型时要用到stack和heap,但使用引用类型时实际上只用到stack中的值,然后通过这个值间接的访问heap中的值
C#预定义的简单类型,像int,float,bool,char都是值类型,另外enum(枚举),struct(结构)也是值类型
string,数组,自定义的class就都是引用类型了.其中的string是比较特殊的引用类型.C#给它增加个字符恒定的特性.
C#函数的参数如果不加ref,out这样的修饰符显式申明参数是通过引用传递外,默认都是值传递.
这里要注意的一个问题是,参数的类型是值类型还是引用类型和传参数时用值传递还是引用传递是两个不同的概念.
假如有void FunTest(int array) 和void FunTest(int a) 这两个函数.参数array是引用类型,a是值类型.但是他们传递时都是按值传递.
举个例子说明下
按值传递参数:
class Program
{
public static void ChangeInt(int num)
{
num = 123;
}
public static void ChangeArray(int array)
{
array = 10;
array = new int { 6, 7, 8, 9 };
}
static void Main(string args)
{
int anum = 1;
int aarray = { 1, 2, 3 };
ChangeInt(anum);
ChangeArray(aarray);
Console.WriteLine("value of num: " + anum);
Console.Write("value of aarray: ");
foreach (int i in aarray)
Console.Write(i + " ");
}
}
结果是:value of anum : 1
value of aarray :10 2 3
可能看到结果会有点奇怪.一般认为值传递就是把值拷贝一份,然后不管在函数中对传入的参数做啥改变,参数之前的值不会受啥影响,所以anum没有变成123,仍然是1
前面有说到引用类型在内存中是保存为两个部分,一个是stack中的内存地址,另一个是heap中的实际值.用时只直接用stack中的值,我们假如stack中的值为0xabcdefgh ,就说是aaraay指向它吧. 那么按值传递时就是把这个stack的值拷贝成另一份就假如是array指向它吧.跟拷贝anum的值1一样.
但是操作内存地址这样的值时不会像整数一样直接操作它,而只会通过它去找heap中的实际值.
于是array {6,7,8,9}没有对之前传的aarray产生影响.这个操作的意义是在heap中重新开辟一块内存,保存着值6,7,8,9. 这这块内存的地址赋给array,于是它之前的值0xabcdefgh被改写了.但aarray指的值stack值仍没变,仍是0xabcdefgh
按引用传递参数
可以用out或ref显式指定.大部分时候可以通用,只是有一点细小区别.先用ref 来举例吧,还用上面的例子,只是加个了关键字ref
class Program
{
public static void ChangeInt(ref int num)
{
num = 123;
}
public static void ChangeArray(ref int array)
{
array = 10;
array = new int { 6, 7, 8, 9 };
}
static void Main(string args)
{
int anum = 1;
int aarray = { 1, 2, 3 };
ChangeInt(ref anum);
ChangeArray(ref aarray);
Console.WriteLine("value of num: " + anum);
Console.Write("value of aarray: ");
foreach (int i in aarray)
Console.Write(i + " ");
}
}
结果是:value of anum : 123
value of aarray :6 7 8 9
跟按值传递的结果完全不同吧
num = 123是容易理解.再来说下aarray的值为啥变了吧,按引用传递时aarray指向的stack中的值不会复制一份,而是直接传过去.这样array {6,7,8,9} 这个语句,则它的结果跟上面按值传递是完全一样的.但有个这句话后就不一样,知道上面说了它的含义,在heap中开辟一块新内存值是6 7 8 9,而aarray指向的stack的值被改写了,改为指向保存6 7 8 9的内存地址了.那含有10 2 3的那一块内存其实还继续存在,只是没有谁引用到它了.到时垃圾回收器会把它回收的.
补充:
说下out 和ref的细小区别
ref 传进来的参数必须要先赋值.
像上面 的例子中如果这样写
int num;
ChangeInt(ref int num);
就会出错,必须先给num给个值1.
而且out传进来的参数可以不先赋值.
out num;
ChangeInt(out int num);是对的
另外还有个区别就是如果用out的时候ChangeInt函数中必须有某个地方给num赋值了,而用ref不一定需要在函数中给num赋值
其实这样做的目的很好理解.C#为了确保在任何情况下num必须有个值,不能为空.因为用ref,在调用函数前必须保证参数有值,所以在函数中就不必要求它一定再赋值,而用out由于在调用函数前不用保证参数必须有值,所以在函数中必须保证给它个值
ChangeInt(ref int num)和ChangeInt(out int num)虽然不一样,但是不同共存,不能当作两个不同的函数
而ChangeInt(int num)和上面 的两个函数是完全不一样的,可以放到一起共存,这样的话调用的时候ref ,out这样的关键字不能省的.必须匹配
List和List<>为什么都可以做方法的参数
我给你说说他们的区别,你就应该明白了,List《T》 通常指的是泛型的一种情况,例如:List《String》表示String参数的类型的集合。
而List《?》的使用是在不确定返回的集合泛型是什么类型的情况下所采用的一种方式。?表示是无限制的通配符。参数是可以任何的类型。List《T》 list =new List《T》();
T t = new T();T可以在同一个类中可以进行重复的使用,而?则不能达到这样的效果。
java两个同名一样的,参数类型都是同样的集合类型,但泛型的元素类型不
是同一个方法,泛型修饰方法是说该方法可用于不同的泛型元素类型,可以看一下泛型的定义
Python3 输入输出和File(文件) 方法
Python两种输出值的方式: 表达式语句和 print() 函数。第三种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.stdout 引用。
如果你希望输出的形式更加多样,可以使用 str.format() 函数来格式化输出值。如果你希望将输出的值转成字符串,可以使用 repr() 或 str() 函数来实现。
str(): 函数返回一个用户易读的表达形式。
repr(): 产生一个解释器易读的表达形式。
str.format() 的使用
读取键盘输入
Python 提供了 input() 内置函数,从标准输入读入一行文本,默认的标准输入是键盘。
open() 用于打开一个文件,并返回文件对象,基本语法格式如下:
open(filename, mode=’r’)
完整的语法格式为:
open(filename, mode=’r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
filename: 必需,文件路径+文件名称(相对或者绝对路径)
mode: 可选,文件打开模式:只读,写入,追加等,默认模式为只读(r)
buffering: 设置缓冲
encoding: 一般使用utf8
errors: 报错级别
newline: 区分换行符
closefd: 传入的file参数类型
opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符。
不同模式mode打开文件的说明:
t 文本模式 (默认的模式)
b 二进制模式,一般用于非文本文件如图片等
x 写模式,新建一个文件,如果该文件已存在则会报错
+ 打开一个文件进行更新(可读可写)
r 以只读方式打开文件。文件的指针将会放在文件的开头。是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始,即原有内容会被删除。如果该文件不存在,创建新文件。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始,即原有内容会被删除。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
f.write(string) 将 string 写入到文件中, 然后返回写入的字符数
f.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。
f.read(size) 读取一定数目的数据, 然后作为字符串或字节对象返回。size 是一个可选参数。当 size 参数忽略或者为负, 那么该文件的所有内容都将被读取并且返回。
f.readline() 从文件中读取单独的一行。换行符为 ’\n’。读取整行,包括 "\n" 字符。f.readline() 如果返回一个空字符串, 说明已经读取到最后一行。
f.readlines( 读取所有行并返回列表类型,若给定sizeint》0,返回总和大约为sizeint字节的行, 并且将这些字节按行分割。实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。
f.tell() 返回文件对象当前所处的位置, 它是从文件开头开始算起的字节数。
f.seek() 移动文件读取指针到指定位置,如果要改变文件当前的位置, 可以使用f.seek(offset, from_what) 函数。from_what 的值(默认为0), 如果是 0 表示开头, 如果是 1 表示当前位置, 2 表示文件的结尾,例如:
seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字符
seek(x,1) : 表示从当前位置往后移动x个字符
seek(-x,2):表示从文件的结尾往前移动x个字符
file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入
file.fileno() 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上
file.isatty() 如果文件连接到一个终端设备返回 True,否则返回 False
file.truncate() 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 windows 系统下的换行代表2个字符大小。
f.close() 关闭文件并释放系统的资源。关闭后文件不能再进行读写操作,否则会抛出异常
当处理一个文件对象时, 使用 with 关键字是非常好的方式。在结束后, 它会帮你正确的关闭文件。 而且写起来也比 try - finally 语句块要简短:
python的pickle模块实现了基本的数据序列和反序列化。通过pickle模块的序列化操作能够将程序中运行的对象信息保存到文件中去,永久存储。通过pickle模块的反序列化操作能够从文件中创建上一次程序保存的对象。
基本接口:
pickle.dump(obj, file, )
有了 pickle 对象, 就能对 file 以读取的形式打开:
x = pickle.load(file)
从 file 中读取一个字符串,并将它重构为原来的python对象。
示例:使用pickle模块将数据对象保存到文件
示例:使用pickle模块从文件中重构python对象
参数的取值范围能用集合表示吗
可以的。任何具有相同特征的元素都能够用一个集合表示,参数的取值范围自然也是一个特征,也可以用集合表示。
Java 参数 可以是数组或者是集合如何做
可以直接用Object啊...
因为 Object 可以代指 java里面的任何一种类型
后面不要给,直接一个Object类型的参数
public void setApp(Object obj){
}
这样就行了...
写出java中定义方法的语法格式,并说明一个方法可以有多少个参数,多少个返回值
定义方法的格式是 修饰词(public protect private default)是否静态(static) 是否有返回值(void或返回值类型) 方法名(参数类型 参数名){方法体},一般参数个数没有限制,但是不建议写太多,返回值类型只能是一个,多个返回值可用集合类型。

更多文章:
avantage怎么设置为中文(Avantage安装丢失GIT)
2026年10月15日 03:00
activex控件未注册怎么办(登陆视频监控网页时提示activex控件未注册,怎么解决)
2026年10月14日 20:30
excel连接sql数据库教程(excel怎么连接sql数据库)
2026年10月14日 19:40






