泛型委托Action与Func 【 优品课堂 C#进阶与提高系列 】

合集下载

C#Action委托

C#Action委托

C#Action委托 最近碰到了很多关于Action的⼀些代码,稍微看了下⽤法 Action的作⽤是封装⼀个函数,且该⽅法没有返回值(有返回值的函数⽆法被Action封装)。

同时Action还⽀持不同参数数量的函数,通过泛型来实现。

Action<T>代表Action所封装的函数是有⼀个参数,参数类型为T。

同理,Action最多⽀持16个参数的函数委托,不过每个参数的数据类型都要写到泛型⾥。

不同参数类型的Action声明: Action Action<T> Action<T,T> Action<T,T,T> ...... Action其实是⼀个委托delegate,如果我们使⽤delegate去封装⼀个函数的话,⾸先是需要进⾏委托声明的,如下⾯的代码1namespace Delegate_Action2 {3//⾃定义委托声明4public delegate void delegateFuntion();5class Program6 {7static void Main(string[] args)8 {9 Test t = new Test();10 delegateFuntion myFunction = t.Function; //函数封装11 myFunction();1213return;14 }15 }1617class Test18 {19public void Function()20 {21 Console.WriteLine("Test Function!");22 }23 }24 } 可以看到第4⾏进⾏了委托声明的动作,⽽为了操作简便,Action委托就可以免去这⼀步骤 如果⽤Action进⾏封装的话,代码如下1namespace Delegate_Action2 {3class Program4 {5static void Main(string[] args)6 {7 Test t = new Test();8 Action myAction = t.Function; //直接到位9 myAction();1011return;12 }13 }1415class Test16 {17public void Function()18 {19 Console.WriteLine("Test Function!");20 }21 }22 } 同时Action⽀持委托和匿名函数1namespace Delegate_Action2 {3class Program4 {5static void Main(string[] args)6 {7 Test t = new Test();8 Action myAction = delegate() { Console.WriteLine("Delegate Function!"); }; //直接到位9 myAction();1011return;12 }13 } 最后就是Action可以通过参数的形式传递函数,这样就可以将Action⽤作回调函数(个⼈感觉⽤处最多的地⽅),代码如下 1namespace Delegate_Action2 {3class Program4 {5static void Main(string[] args)6 {7 Test t = new Test(CallBackFuntion);8 t.Function();910return;11 }1213static void CallBackFuntion()14 {15 Console.WriteLine("Program Call Back Function!");16 }17 }1819class Test20 {21 Action callBack;2223public Test(Action cb)24 {25 callBack = cb;26 }2728public void Function()29 {30 Console.WriteLine("Test Function!");31 callBack(); 32 }33 }3435//结果:36// Test Function!37// Program Call Back Function!38 }。

泛型的使用方法

泛型的使用方法

泛型的使用方法
泛型的使用方法主要有三种:泛型类、泛型接口和泛型方法。

1. 泛型类:在类名的后面用尖括号括起一个(或多个)类型参数。

类型参数的作用域是定义这个类型参数的整个类,但不包括静态成员方法。

因为其类型参数不定,无法直接分配储存空间。

2. 泛型方法:在方法的返回类型前面加上一个类型参数T,并有<>括起来。

3. 泛型接口:在接口名之后加上类型参数。

通过使用泛型,可以更灵活地处理数据,避免代码的重复,提高代码的复用性。

C#中的Action、Func和Predicate如何使用

C#中的Action、Func和Predicate如何使用

C#中的Action、Func和Predicate如何使⽤前⾔委托是⼀个类型安全的函数指针,它可以引⽤与委托具有相同签名的⽅法。

委托常⽤于实现回调⽅法或者事件机制,在C#中⼀般⽤"delegate" 关键字声明。

你可以声明⼀个和类平级的委托,也可以嵌套在类中。

Func 和 Action 是什么,如何使⽤?两者最基本的区别是,前者适合那些需要带返回值的委托,后者适合那些不带返回值的委托。

Func 所引⽤的⽅法接收⼀个或者多个⼊参并带有⼀个返回值,Action所引⽤的⽅法接收⼀个或者多个参数并且没有返回值,换句话说,你的委托所引⽤的⽅法没有返回值,这时候适合⽤ Action。

Predicate所引⽤的⽅法接收⼀个或者多个泛型参数并且返回⼀个 bool 值,你可以假定它等价于 Func<T,bool>,Predicate 常⽤于对collection 进⾏⼀组条件检索。

C# 中使⽤ Action你可以使⽤委托去实现事件和回调⽅法,C#委托⾮常类似于C++中的函数指针,但是 C# 中的委托是类型安全的,你可以将⽅法作为参数传递给委托从⽽让委托指向该⽅法。

下⾯的代码⽚段展⽰了 Action 委托的语法结构。

Action<TParameter>接下来的代码清单展⽰了如何使⽤ Action 委托,当下⾯的代码执⾏结束后会在控制台打印 Hello 。

static void Main(string[] args){Action<string> action = new Action<string>(Display);action("Hello");Console.Read();}static void Display(string message){Console.WriteLine(message);}C# 中使⽤ Func现在我们⼀起学习下 Func 委托,下⾯是 Func 的语法结构。

c#中的数据类型简介(委托)

c#中的数据类型简介(委托)

c#中的数据类型简介(委托)c#中的数据类型简介(委托)什么是委托?委托是⼀种类型,它封装了⼀类⽅法,这些⽅法具有相同的⽅法签名(signature)和返回类型。

定义听起来有点拗⼝,⾸先可以确定委托是⼀种数据类型,那么什么是⽅法签名,其实就是指⽅法的输⼊参数列表。

来看下⾯的例⼦,类deleMthod定义了3个⽅法,add、minus 和multi,他们都具有相同的输⼊参数列表(int x,int y)和输出参数类型int,那么我们就说这三个⽅法具有相同的⽅法签名和返回类型。

开发者可以抽象地⽤ int 某名称(int x,int y) 的⼀种类型对⽅法进⾏封装,在c#中这种抽象的数据类型叫委托,针对上述的⼏个⽅法我们可以定义委托 : public delegate int Handler(int x ,int y),public 是⼀个访问修饰符,delegate关键字表⽰这是⼀个委托,int Hander(int x,int y)表⽰这个委托的名称。

class deleMethod{public int add(int x, int y){return x + y;}public int minus(int x, int y){return x - y;}public int multi(int x, int y){return x * y;}}怎么使⽤委托使⽤委托⼤体有四个步骤:定义⼀个委托类型,上节已经提及。

定义委托⽅法,上节deleMethod类中add、minus、multi都是委托⽅法,定义的⽬的就是为了使⽤它,讲专业点就是为了⽅法的调⽤委托变量及赋值,和类型⼀样,在使⽤前需要对变量赋值。

委托变量的使⽤。

怎样定义委托变量,还是接着上⾯的例⼦。

我们已经定义了⼀个委托类型 public delegate int Handler(int x,int y),和c#语法规范⼀样定义⼀个变量并赋值语法是:“类型名变量名 = new 类型名(⽅法);”,如上例“Handler deleCall = new Handler(⽅法名);“,在.net2.0后对于委托的实例化可以简化为” Handler deleCall = ⽅法名;“。

委托和lambda表达式,Action和Func

委托和lambda表达式,Action和Func

委托和lambda表达式,Action和Func1、为什么要⽤委托我们为什么要有委托?任何东西存在即合理,不合理的也会被时间淘汰掉,委托既然存在肯定有存在的必要,我们来看⼀下什么时候可以⽤到委托。

接下来我们有个需求,就是调⽤⼀个⽅法,取出1-1000个数字中所有是10的倍数的数字public static List<int> GetNum() {List<int> lst = new List<int>();//这个算法是最简陋的,但是举这个例⼦是最合适的for (int i = 1; i < 1000; i++){if (i%10==0) {lst.Add(i);}}return lst;}这个很好写,但是如果有⼀天,我们的需求变了,想取出1-1000个数字中所有是8的倍数的数字,那我们应该怎么写?是不是只要将if⾥⾯的条件改为i%8==0就⾏了,但是有⼀点变动的话就修改⽅法,说明这个⽅法写的并不好,如果⽅法很复杂的话修改也很艰难。

可能有⼈会说在添加⼀个获取是8的倍数的⽅法,这样的话会增加数据冗余,也就是重复的内容。

如果我们可以传递⽅法的话,只要传过来⼀个(有⼀个参数为int类型返回值为Boolean类型的⽅法),这个问题将不是问题public static List<int> GetNum(有⼀个int类型的参数返回值为Boolean类型的⽅法) {List<int> lst = new List<int>();for (int i = 1; i < 1000; i++){if (有⼀个int类型的参数返回值为Boolean类型的⽅法) {lst.Add(i);}}return lst;}是不是我们将想要获取什么样的数字这个操作来交给了调⽤者,⽆论调⽤者想获取1-1000以内什么样的数字都可以完成。

但是这个⽅法的前提就是可以传递⽅法,这个时候我们就需要⽤到委托了。

泛型的用法

泛型的用法

泛型的用法泛型是一种程序设计的技术,它让我们能够在编写代码时更灵活地处理不同类型的数据,而无需重复编写相似的代码。

泛型的概念可以追溯到Java语言的引入,但现在已经被许多主流编程语言所支持,例如C#、C++和Python等。

泛型的主要用途是增加代码的复用性和可维护性。

我们知道,在传统的程序设计中,如果想要编写一个可以应对不同数据类型的函数或类,就需要为每个数据类型单独编写相应的代码。

这不仅增加了代码量,也增加了维护的困难度。

而有了泛型,我们只需要编写一份通用的代码,就可以适应不同的数据类型。

这样一来,我们不仅能够节省大量的工作量,还可以有效地减少代码的错误和bug。

泛型的用法非常灵活,可以应用于各种场景。

比如,我们可以使用泛型来定义容器类,例如ArrayList,在创建ArrayList时,可以指定存储的数据类型,使得该ArrayList只能存储相应类型的数据。

这样一来,我们就可以确保我们在使用该ArrayList时不会出现类型错误。

另外,我们也可以使用泛型来编写算法,例如排序算法。

通过泛型,我们可以编写一份通用的排序算法,可以适应不同类型的数据,并且保证排序的正确性。

除了基本类型,泛型也可以应用于自定义的数据类型。

我们可以通过泛型来定义自己的类、接口和方法,使它们能够处理不同类型的数据。

这样一来,我们可以更加灵活地设计和实现我们的程序。

例如,我们可以定义一个泛型类来表示一个队列,它可以放入任何类型的数据。

这样一来,我们就可以在不同场景下使用相同的代码来处理不同类型的数据,提高了代码的可复用性和可维护性。

在使用泛型的时候,我们需要注意一些细节。

首先,我们需要使用尖括号"< >"来指定我们的泛型参数。

比如在定义一个泛型类时,我们可以使用类似于"ArrayList<T>"的形式来指定T为一个泛型参数。

其次,我们需要在使用泛型时进行类型的检查和类型的转换。

C#内置泛型委托之Func委托

C#内置泛型委托之Func委托

C#内置泛型委托之Func委托⼀、什么是Func委托Func委托代表有返回类型的委托⼆、Func委托定义查看Func的定义:using pilerServices;namespace System{//// 摘要:// 封装⼀个⽅法,该⽅法具有两个参数,并返回由 TResult 参数指定的类型的值。

//// 参数:// arg1:// 此委托封装的⽅法的第⼀个参数。

//// arg2:// 此委托封装的⽅法的第⼆个参数。

//// 类型参数:// T1:// 此委托封装的⽅法的第⼀个参数的类型。

//// T2:// 此委托封装的⽅法的第⼆个参数的类型。

//// TResult:// 此委托封装的⽅法的返回值类型。

//// 返回结果:// 此委托封装的⽅法的返回值。

[TypeForwardedFrom("System.Core, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089")] public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);}你会发现,Func其实就是有多个输出参数并且有返回值的delegate。

3、⽰例Func⾄少0个输⼊参数,⾄多16个输⼊参数,根据返回值泛型返回。

必须有返回值,不可void。

Func<int> 表⽰没有输⼊参参,返回值为int类型的委托。

Func<object,string,int> 表⽰传⼊参数为object, string ,返回值为int类型的委托。

Func<object,string,int> 表⽰传⼊参数为object, string,返回值为int类型的委托。

Func<T1,T2,,T3,int> 表⽰传⼊参数为T1,T2,,T3(泛型),返回值为int类型的委托。

func函数的功能c语言

func函数的功能c语言

func函数的功能c语言func函数的一般格式为:返回值类型函数名(参数列表){函数体}其中,返回值类型为该函数返回的数据类型,函数名为该函数的名称,参数列表为该函数需要传入的参数,函数体为该函数的具体操作。

例如,下面是一个计算两个数之和的func函数:int add(int a, int b){int sum = a + b;return sum;}该函数的返回值为int型,函数名为add,参数列表为两个int型变量a和b,函数体为计算a和b的和并将结果赋给变量sum,然后将sum返回。

func函数的三个基本要素1. 返回值类型函数的返回值类型表示函数运算结束后所要返回的数据类型。

返回值类型可以是各种基本类型,比如int、float、char等,也可以是结构体、数组等类型。

返回值类型可以使用基本数据类型组成的表达式计算。

如果函数不需要返回值,则应该使用void类型作为返回值。

2. 参数列表参数列表指函数在被调用时所需要传递的参数。

参数可以是各种数据类型的变量,也可以是指针、结构体等类型。

参数列表可以为空,此时括号内留空即可。

函数参数的传递可以采用以下两种方式:按值传递:将参数的值复制到函数栈上,函数体内操作的是该值的副本。

3. 函数体函数体是函数的具体操作部分,包括各种逻辑结构、变量定义、运算操作等等,具体内容根据不同函数的用途而不同。

函数体中可以调用其他函数,也可以定义局部变量、全局变量,可以使用各种循环、条件、选择等结构实现不同的功能。

func函数是c语言中最基本、最通用也是最常用的一种函数。

主要原因在于它具有以下几个特点:1. 灵活性func函数可以根据不同的需求进行自由定义,返回值类型、参数列表、函数体都可以自由组合。

这使得它能够满足各种不同的操作需求。

2. 可复用性func函数可以在多个程序中重复使用,减少了程序的冗余,提高了代码的可维护性和可读性。

3. 易于调试func函数独立于程序主体,便于单独进行调试和优化,同时也方便了不同部分的协同开发。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

江西省南昌市2015-2016学年度第一学期期末试卷(江西师大附中使用)高三理科数学分析一、整体解读试卷紧扣教材和考试说明,从考生熟悉的基础知识入手,多角度、多层次地考查了学生的数学理性思维能力及对数学本质的理解能力,立足基础,先易后难,难易适中,强调应用,不偏不怪,达到了“考基础、考能力、考素质”的目标。

试卷所涉及的知识内容都在考试大纲的范围内,几乎覆盖了高中所学知识的全部重要内容,体现了“重点知识重点考查”的原则。

1.回归教材,注重基础试卷遵循了考查基础知识为主体的原则,尤其是考试说明中的大部分知识点均有涉及,其中应用题与抗战胜利70周年为背景,把爱国主义教育渗透到试题当中,使学生感受到了数学的育才价值,所有这些题目的设计都回归教材和中学教学实际,操作性强。

2.适当设置题目难度与区分度选择题第12题和填空题第16题以及解答题的第21题,都是综合性问题,难度较大,学生不仅要有较强的分析问题和解决问题的能力,以及扎实深厚的数学基本功,而且还要掌握必须的数学思想与方法,否则在有限的时间内,很难完成。

3.布局合理,考查全面,着重数学方法和数学思想的考察在选择题,填空题,解答题和三选一问题中,试卷均对高中数学中的重点内容进行了反复考查。

包括函数,三角函数,数列、立体几何、概率统计、解析几何、导数等几大版块问题。

这些问题都是以知识为载体,立意于能力,让数学思想方法和数学思维方式贯穿于整个试题的解答过程之中。

二、亮点试题分析1.【试卷原题】11.已知,,A B C 是单位圆上互不相同的三点,且满足AB AC →→=,则AB AC →→⋅的最小值为( )A .14-B .12-C .34-D .1-【考查方向】本题主要考查了平面向量的线性运算及向量的数量积等知识,是向量与三角的典型综合题。

解法较多,属于较难题,得分率较低。

【易错点】1.不能正确用OA ,OB ,OC 表示其它向量。

2.找不出OB 与OA 的夹角和OB 与OC 的夹角的倍数关系。

【解题思路】1.把向量用OA ,OB ,OC 表示出来。

2.把求最值问题转化为三角函数的最值求解。

【解析】设单位圆的圆心为O ,由AB AC →→=得,22()()OB OA OC OA -=-,因为1OA OB OC ===,所以有,OB OA OC OA ⋅=⋅则()()AB AC OB OA OC OA ⋅=-⋅-2OB OC OB OA OA OC OA =⋅-⋅-⋅+ 21OB OC OB OA =⋅-⋅+设OB 与OA 的夹角为α,则OB 与OC 的夹角为2α所以,cos 22cos 1AB AC αα⋅=-+2112(cos )22α=--即,AB AC ⋅的最小值为12-,故选B 。

【举一反三】【相似较难试题】【2015高考天津,理14】在等腰梯形ABCD 中,已知//,2,1,60AB DC AB BC ABC ==∠= ,动点E 和F 分别在线段BC 和DC 上,且,1,,9BE BC DF DC λλ==则AE AF ⋅的最小值为 .【试题分析】本题主要考查向量的几何运算、向量的数量积与基本不等式.运用向量的几何运算求,AE AF ,体现了数形结合的基本思想,再运用向量数量积的定义计算AE AF ⋅,体现了数学定义的运用,再利用基本不等式求最小值,体现了数学知识的综合应用能力.是思维能力与计算能力的综合体现. 【答案】2918【解析】因为1,9DF DC λ=12DC AB =,119199918CF DF DC DC DC DC AB λλλλλ--=-=-==, AE AB BE AB BC λ=+=+,19191818AF AB BC CF AB BC AB AB BC λλλλ-+=++=++=+,()221919191181818AE AF AB BC AB BC AB BC AB BCλλλλλλλλλ+++⎛⎫⎛⎫⋅=+⋅+=+++⋅⋅ ⎪ ⎪⎝⎭⎝⎭19199421cos1201818λλλλ++=⨯++⨯⨯⨯︒2117172992181818λλ=++≥+= 当且仅当2192λλ=即23λ=时AE AF ⋅的最小值为2918. 2.【试卷原题】20. (本小题满分12分)已知抛物线C 的焦点()1,0F ,其准线与x 轴的交点为K ,过点K 的直线l 与C 交于,A B 两点,点A 关于x 轴的对称点为D . (Ⅰ)证明:点F 在直线BD 上; (Ⅱ)设89FA FB →→⋅=,求BDK ∆内切圆M 的方程. 【考查方向】本题主要考查抛物线的标准方程和性质,直线与抛物线的位置关系,圆的标准方程,韦达定理,点到直线距离公式等知识,考查了解析几何设而不求和化归与转化的数学思想方法,是直线与圆锥曲线的综合问题,属于较难题。

【易错点】1.设直线l 的方程为(1)y m x =+,致使解法不严密。

2.不能正确运用韦达定理,设而不求,使得运算繁琐,最后得不到正确答案。

【解题思路】1.设出点的坐标,列出方程。

2.利用韦达定理,设而不求,简化运算过程。

3.根据圆的性质,巧用点到直线的距离公式求解。

【解析】(Ⅰ)由题可知()1,0K -,抛物线的方程为24y x =则可设直线l 的方程为1x my =-,()()()112211,,,,,A x y B x y D x y -,故214x my y x =-⎧⎨=⎩整理得2440y my -+=,故121244y y m y y +=⎧⎨=⎩则直线BD 的方程为()212221y y y y x x x x +-=--即2222144y y y x y y ⎛⎫-=- ⎪-⎝⎭令0y =,得1214y yx ==,所以()1,0F 在直线BD 上.(Ⅱ)由(Ⅰ)可知121244y y m y y +=⎧⎨=⎩,所以()()212121142x x my my m +=-+-=-,()()1211111x x my my =--= 又()111,FA x y →=-,()221,FB x y →=-故()()()21212121211584FA FB x x y y x x x x m →→⋅=--+=-++=-,则28484,93m m -=∴=±,故直线l 的方程为3430x y ++=或3430x y -+=213y y -===±,故直线BD 的方程330x -=或330x -=,又KF 为BKD ∠的平分线,故可设圆心()(),011M t t -<<,(),0M t 到直线l 及BD 的距离分别为3131,54t t +--------------10分 由313154t t +-=得19t =或9t =(舍去).故圆M 的半径为31253t r +== 所以圆M 的方程为221499x y ⎛⎫-+= ⎪⎝⎭【举一反三】【相似较难试题】【2014高考全国,22】 已知抛物线C :y 2=2px(p>0)的焦点为F ,直线y =4与y 轴的交点为P ,与C 的交点为Q ,且|QF|=54|PQ|.(1)求C 的方程;(2)过F 的直线l 与C 相交于A ,B 两点,若AB 的垂直平分线l′与C 相交于M ,N 两点,且A ,M ,B ,N 四点在同一圆上,求l 的方程.【试题分析】本题主要考查求抛物线的标准方程,直线和圆锥曲线的位置关系的应用,韦达定理,弦长公式的应用,解法及所涉及的知识和上题基本相同. 【答案】(1)y 2=4x. (2)x -y -1=0或x +y -1=0. 【解析】(1)设Q(x 0,4),代入y 2=2px ,得x 0=8p,所以|PQ|=8p ,|QF|=p 2+x 0=p 2+8p.由题设得p 2+8p =54×8p ,解得p =-2(舍去)或p =2,所以C 的方程为y 2=4x.(2)依题意知l 与坐标轴不垂直,故可设l 的方程为x =my +1(m≠0). 代入y 2=4x ,得y 2-4my -4=0. 设A(x 1,y 1),B(x 2,y 2), 则y 1+y 2=4m ,y 1y 2=-4.故线段的AB 的中点为D(2m 2+1,2m), |AB|=m 2+1|y 1-y 2|=4(m 2+1).又直线l ′的斜率为-m ,所以l ′的方程为x =-1m y +2m 2+3.将上式代入y 2=4x ,并整理得y 2+4m y -4(2m 2+3)=0.设M(x 3,y 3),N(x 4,y 4),则y 3+y 4=-4m,y 3y 4=-4(2m 2+3).故线段MN 的中点为E ⎝ ⎛⎭⎪⎫2m2+2m 2+3,-2m ,|MN|=1+1m 2|y 3-y 4|=4(m 2+1)2m 2+1m 2.由于线段MN 垂直平分线段AB ,故A ,M ,B ,N 四点在同一圆上等价于|AE|=|BE|=12|MN|,从而14|AB|2+|DE|2=14|MN|2,即 4(m 2+1)2+⎝ ⎛⎭⎪⎫2m +2m 2+⎝ ⎛⎭⎪⎫2m 2+22=4(m 2+1)2(2m 2+1)m 4,化简得m 2-1=0,解得m =1或m =-1, 故所求直线l 的方程为x -y -1=0或x +y -1=0.三、考卷比较本试卷新课标全国卷Ⅰ相比较,基本相似,具体表现在以下方面: 1. 对学生的考查要求上完全一致。

即在考查基础知识的同时,注重考查能力的原则,确立以能力立意命题的指导思想,将知识、能力和素质融为一体,全面检测考生的数学素养,既考查了考生对中学数学的基础知识、基本技能的掌握程度,又考查了对数学思想方法和数学本质的理解水平,符合考试大纲所提倡的“高考应有较高的信度、效度、必要的区分度和适当的难度”的原则. 2. 试题结构形式大体相同,即选择题12个,每题5分,填空题4 个,每题5分,解答题8个(必做题5个),其中第22,23,24题是三选一题。

题型分值完全一样。

选择题、填空题考查了复数、三角函数、简易逻辑、概率、解析几何、向量、框图、二项式定理、线性规划等知识点,大部分属于常规题型,是学生在平时训练中常见的类型.解答题中仍涵盖了数列,三角函数,立体何,解析几何,导数等重点内容。

3. 在考查范围上略有不同,如本试卷第3题,是一个积分题,尽管简单,但全国卷已经不考查了。

四、本考试卷考点分析表(考点/知识点,难易程度、分值、解题方式、易错点、是否区分度题)。

相关文档
最新文档