泛型类型实例化的类型别名生成_第1页
泛型类型实例化的类型别名生成_第2页
泛型类型实例化的类型别名生成_第3页
泛型类型实例化的类型别名生成_第4页
泛型类型实例化的类型别名生成_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

24/29泛型类型实例化的类型别名生成第一部分泛型类型的类型别名简介。 2第二部分不同语言对泛型类型的类型别名支持情况。 4第三部分类型别名在泛型类型实例化中的应用场景。 8第四部分类型别名的作用及其好处。 12第五部分类型别名与模板的区别和联系。 14第六部分类型别名与预处理宏的异同比较。 16第七部分类型别名的使用注意事项和局限性。 18第八部分类型别名在实际项目中的应用实例。 24

第一部分泛型类型的类型别名简介。关键词关键要点【泛型类型的类型别名简介】:

1.类型别名是一种新的语法糖,它允许将一个类型赋给一个名称,从而简化代码并提高可读性。

2.泛型类型的类型别名允许使用类型参数来定义类型别名,从而可以创建可重用的类型别名。

3.泛型类型的类型别名可以用于函数、变量和类等,从而提高代码的可重用性和可读性。

【泛型类型的类型别名的好处】:

泛型类型的类型别名简介

泛型类型别名是C++11引入的一项功能,允许您使用别名来引用泛型类型。这可以提高代码的可读性和可维护性,因为它允许您将类型定义与其实际使用分开。

泛型类型别名使用`typedef`关键字定义。语法如下:

```cpp

template<typenameT>

usingMyGenericType=std::vector<T>;

```

这将创建类型别名`MyGenericType`,它将引用泛型类型`std::vector<T>`。您可以像使用任何其他类型一样使用`MyGenericType`。例如,您可以声明以下变量:

```cpp

MyGenericType<int>myVector;

```

这将创建一个类型为`std::vector<int>`的变量。

泛型类型别名可以用于任何泛型类型。您甚至可以创建嵌套的泛型类型别名。例如,您可以定义以下别名:

```cpp

template<typenameT>

usingMyNestedGenericType=std::map<std::string,T>;

```

这将创建类型别名`MyNestedGenericType`,它将引用泛型类型`std::map<std::string,T>`。您可以像使用任何其他类型一样使用`MyNestedGenericType`。例如,您可以声明以下变量:

```cpp

MyNestedGenericType<int>myMap;

```

这将创建一个类型为`std::map<std::string,int>`的变量。

泛型类型别名是C++中一种非常有用的工具,可以提高代码的可读性和可维护性。它们可以用于任何泛型类型,包括标准库类型和您自己定义的类型。

泛型类型别名的优点

泛型类型别名有许多优点,包括:

*提高可读性:泛型类型别名可以使您的代码更易于阅读和理解。通过将类型定义与其实际使用分开,您可以更轻松地看到正在使用哪些类型。

*提高可维护性:泛型类型别名可以使您的代码更易于维护。如果您需要更改类型定义,则只需更改别名定义即可。您不必在代码中查找和替换所有使用该类型的实例。

*代码重用:泛型类型别名可以帮助您重用代码。您可以定义一个泛型类型别名,然后在不同的上下文中使用它。这可以节省时间和精力。

泛型类型别名的局限性

泛型类型别名也有一些局限性,包括:

*编译器错误:泛型类型别名可能会导致编译器错误。这是因为编译器在编译代码时可能无法确定泛型类型别名的类型。

*运行时错误:泛型类型别名也可能导致运行时错误。这是因为泛型类型别名的类型可能会在运行时更改。

结论

泛型类型别名是C++中一种非常有用的工具,可以提高代码的可读性、可维护性和代码重用。但是,在使用泛型类型别名时也需要注意它们的局限性。第二部分不同语言对泛型类型的类型别名支持情况。关键词关键要点【C++】:

1.C++11中引入了类型别名,允许用户定义新的类型名称来表示其他类型。例如,您可以使用以下语句定义一个名为`Vector`的类型别名来表示`std::vector<int>`:

```

typedefstd::vector<int>Vector;

```

2.C++14中引入了模板类型别名,允许用户定义模板类型的别名。例如,您可以使用以下语句定义一个名为`Vector`的模板类型别名来表示`std::vector<T>`:

```

template<typenameT>

usingVector=std::vector<T>;

```

3.模板类型别名可以使代码更简洁、更易读。例如,以下代码使用模板类型别名`Vector`来定义一个存储整数的向量:

```

Vector<int>v;

```

【Java】

泛型类型实例化的类型别名生成

#不同语言对泛型类型的类型别名支持情况

泛型类型实例化的类型别名支持情况在不同编程语言中有所不同。有些语言支持显式地定义类型别名,而另一些语言则不支持。

C++

C++11引入了`using`关键字来定义类型别名。可以使用`using`关键字来定义泛型类型实例化的类型别名,语法如下:

```

using类型别名=泛型类型<类型参数>;

```

例如,可以定义一个`vector`类型的别名`IntVector`,如下:

```

usingIntVector=std::vector<int>;

```

然后,可以使用该别名来声明和使用`vector`类型,如下:

```

IntVectornumbers;

```

Java

Java不支持显式地定义类型别名。但是,可以使用`Generics`来实现类似于类型别名的效果。例如,可以定义一个`List`类型的别名`IntList`,如下:

```

List<Integer>IntList=newArrayList<>();

```

然后,可以使用该别名来声明和使用`List`类型,如下:

```

IntListnumbers=newArrayList<>();

```

Python

Python不支持显式地定义类型别名。但是,可以使用变量名来实现类似于类型别名的效果。例如,可以定义一个`list`类型的别名`IntList`,如下:

```

IntList=[]

```

然后,可以使用该别名来声明和使用`list`类型,如下:

```

numbers=IntList()

```

C#

C#支持显式地定义类型别名。可以使用`using`关键字来定义泛型类型实例化的类型别名,语法如下:

```

using类型别名=泛型类型<类型参数>;

```

例如,可以定义一个`List`类型的别名`IntList`,如下:

```

usingIntList=System.Collections.Generic.List<int>;

```

然后,可以使用该别名来声明和使用`List`类型,如下:

```

IntListnumbers=newIntList();

```

总结

不同语言对泛型类型的类型别名支持情况有所不同。有些语言支持显式地定义类型别名,而另一些语言则不支持。但是,可以使用各种方法来实现类似于类型别名的效果。第三部分类型别名在泛型类型实例化中的应用场景。关键词关键要点【类型别名的类型推断】:

1.类型别名可以帮助编译器自动推断泛型类型的具体类型参数,从而简化代码编写并提高代码可读性。

2.通过使用类型别名,可以避免在代码中重复指定泛型类型的具体类型参数,从而使代码更加简洁。

3.类型别名可以帮助编译器更好地进行类型检查,从而提高代码的安全性。

【类型别名的代码重用】:

#泛型类型实例化的类型别名生成

一、类型别名的定义及特点

在TypeScript中,类型别名(TypeAlias)允许我们为现有类型或复合类型指定一个新的名称,从而提高代码的可读性和可维护性。类型别名的语法类似于变量声明,使用关键字`type`来定义,后跟类型别名的名称和类型。例如:

```

typeStringOrNumber=string|number;

```

以上定义了一个名为`StringOrNumber`的类型别名,它表示可以是字符串或数字的联合类型。类型别名可以用于任何需要指定类型的场合,例如函数的参数类型、变量的声明类型、类的属性类型等。

二、类型别名在泛型类型实例化中的应用场景

类型别名在泛型类型实例化中具有广泛的应用场景,主要包括以下几个方面:

1.提高代码的可读性和可维护性:通过使用类型别名来代替复杂的泛型类型实例化语法,可以使代码更加简洁易读,同时也便于代码的维护和重构。例如,对于以下代码:

```

constlist1:Array<number>=newArray<number>();

constlist2:Array<string>=newArray<string>();

```

我们可以使用类型别名来简化代码:

```

typeNumberList=Array<number>;

typeStringList=Array<string>;

constlist1:NumberList=newNumberList();

constlist2:StringList=newStringList();

```

使用类型别名后,代码更加简洁,也更容易理解和维护。

2.实现泛型类型的部分类型化:类型别名可以实现泛型类型的部分类型化,即只对泛型类型的部分参数进行类型指定,而将其他参数保留为泛型。例如,对于以下代码:

```

returnarray.map(mapper);

}

```

我们可以使用类型别名来实现部分类型化,指定数组元素的类型,而将映射函数的返回类型保留为泛型:

```

typeNumberArray=Array<number>;

returnarray.map(mapper);

}

```

这样,我们就可以在使用`mapNumbers`函数时,只指定映射函数的返回类型,而无需指定数组元素的类型。这使得代码更加灵活和通用。

3.创建可重用的泛型类型实例:类型别名可以创建可重用的泛型类型实例,从而避免在代码中重复定义相同的泛型类型。例如,对于以下代码:

```

return[...initialValues];

}

constnumbers=createList([1,2,3]);

conststrings=createList(["a","b","c"]);

```

我们可以使用类型别名来创建可重用的泛型类型实例:

```

typeList<T>=T[];

return[...initialValues];

}

constnumbers:List<number>=createList([1,2,3]);

conststrings:List<string>=createList(["a","b","c"]);

```

这样,我们只需要定义一次泛型类型实例`List`,就可以在代码中重复使用它,从而简化代码并提高可维护性。

三、类型别名在泛型类型实例化中的使用注意事项

在使用类型别名来实例化泛型类型时,需要注意以下几点:

1.类型别名不能用于实例化泛型类:类型别名只能用于实例化泛型接口和泛型函数,不能用于实例化泛型类。因为泛型类需要在实例化时指定类名和类型参数,而类型别名只能指定类型。

2.类型别名中的类型参数不能与泛型函数或泛型接口的类型参数重复:类型别名中的类型参数必须是新的类型变量,不能与泛型函数或泛型接口的类型参数重复。否则会引起编译错误。

3.类型别名只能在当前作用域内使用:类型别名只能在定义它的作用域内使用,不能在其他作用域中使用。因此,如果需要在多个作用域中使用相同的类型别名,需要在每个作用域中重新定义它。

四、总结

类型别名在泛型类型实例化中具有广泛的应用场景,可以提高代码的可读性和可维护性,实现泛型类型的部分类型化,创建可重用的泛型类型实例。在使用类型别名时,需要注意不能用于实例化泛型类、类型参数不能与泛型函数或泛型接口的类型参数重复、只能在当前作用域内使用等注意事项。第四部分类型别名的作用及其好处。关键词关键要点【类型别名的作用及其好处】:

1.可读性增强:类型别名可以提高代码的可读性,因为它允许您为复杂的类型定义一个易于记忆的名称。这使得代码更易于理解和维护。

2.代码重用:类型别名可以提高代码的重用性,因为它允许您在代码库的多个位置使用相同的类型定义。这可以减少冗余并使代码更易于维护。

3.类型检查:类型别名可以帮助类型检查器捕获错误,因为它可以确保您在代码中使用正确的类型。这可以提高代码的健壮性和可靠性。

【使用类型别名的好处】:

类型别名的作用及其好处

类型别名是一种创建新类型的快捷方式,它可以帮助开发者提高代码的可读性和可维护性。类型别名可以用于以下目的:

*提高代码的可读性:通过使用类型别名,开发者可以将复杂或难以理解的类型替换为更简单或更具描述性的名称。例如,以下代码使用`std::map`类型来存储一个字符串键值对的映射:

```cpp

std::map<std::string,std::string>myMap;

```

使用类型别名,我们可以将`std::map<std::string,std::string>`替换为更简单的名称,例如`StringMap`:

```cpp

typedefstd::map<std::string,std::string>StringMap;

StringMapmyMap;

```

这使得代码更容易阅读和理解。

*提高代码的可维护性:类型别名可以帮助开发者在代码库中保持一致的命名约定。例如,如果一个项目中有多个地方需要使用`std::map<std::string,std::string>`类型,那么我们可以创建一个类型别名`StringMap`,并在整个项目中使用这个别名。这使得代码更容易维护,因为如果需要更改`std::map<std::string,std::string>`类型的定义,那么只需要更改一个地方即可。

*提供类型安全:类型别名可以帮助开发者确保代码中的类型安全。例如,如果一个函数需要一个`std::map<std::string,std::string>`类型的参数,那么我们可以使用类型别名`StringMap`来声明这个参数。这可以防止开发者不小心将其他类型的值传递给这个函数,从而导致错误。

类型别名的具体好处

除了上述一般好处之外,类型别名还有一些具体的好处。例如:

*减少代码冗余:类型别名可以帮助开发者减少代码中的冗余。例如,如果一个类有多个方法都需要使用`std::map<std::string,std::string>`类型,那么我们可以使用类型别名`StringMap`来声明这些方法的参数和返回值。这可以减少代码中的冗余,使代码更简洁。

*提高代码的可重用性:类型别名可以帮助开发者提高代码的可重用性。例如,如果一个函数需要一个`std::map<std::string,std::string>`类型的参数,那么我们可以使用类型别名`StringMap`来声明这个参数。这使得我们可以将这个函数用于其他需要`std::map<std::string,std::string>`类型参数的代码中,而无需修改函数的定义。

*提高代码的可测试性:类型别名可以帮助开发者提高代码的可测试性。例如,如果一个函数需要一个`std::map<std::string,std::string>`类型的参数,那么我们可以使用类型别名`StringMap`来声明这个参数。这使得我们可以使用`StringMap`类型来创建测试数据,从而更容易测试函数的正确性。

总之,类型别名是一种非常有用的工具,它可以帮助开发者提高代码的可读性、可维护性、类型安全、可重用性和可测试性。第五部分类型别名与模板的区别和联系。关键词关键要点【模板与泛型类型别名的关联】:

1.模板允许用户定义参数化类型,而泛型类型别名允许用户定义参数化类型的别名。

2.泛型类型别名可以简化模板的语法,使代码更具可读性和简洁性。

3.泛型类型别名可以提高代码的可重用性,因为它可以被用在不同的模板中。

【模板和泛型类型别名的区别】:

#类型别名与模板的区别和联系

区别

1.语法不同

-类型别名使用`typealias`关键字定义,模板使用`template`关键字定义。

-类型别名可以为任何类型起别名,而模板只能为类型参数起别名。

-类型别名可以定义多个,而模板只能定义一个。

2.作用不同

-类型别名可以提高代码的可读性和可维护性,而模板可以提高代码的可重用性。

-类型别名可以使代码更易于理解,而模板可以使代码更易于扩展。

3.使用场景不同

-类型别名通常用于将复杂类型重命名为一个更简单的名称,而模板通常用于将代码复用来处理不同类型的数据。

-类型别名可以使代码更易于阅读和理解,而模板可以使代码更易于扩展和维护。

联系

1.都是类型

-类型别名和模板都是类型,因此都可以用于声明变量、函数参数和函数返回值类型。

2.都可以提高代码的可读性、可维护性和可重用性

-类型别名和模板都可以提高代码的可读性、可维护性和可重用性。

3.都可以用于泛型编程

-类型别名和模板都可以用于泛型编程,即编写可以在不同类型上工作的代码。

4.都可以用于代码生成

-类型别名和模板都可以用于代码生成,即使用程序生成代码。第六部分类型别名与预处理宏的异同比较。关键词关键要点类型别名与预处理宏的共性

1.语法结构:类型别名和预处理器宏都在源代码中使用特定的语法结构来定义和使用。类型别名使用关键字typedef和类型名称来定义新的类型别名,而预处理器宏使用#define指令和宏名称来定义宏。

2.替代功能:类型别名和预处理器宏都可以在源代码中替代其他标识符。类型别名替代目标类型名称,而预处理器宏替代目标文本。

3.源码预处理:类型别名和预处理器宏都是在源代码预处理阶段进行处理的。在预处理阶段,类型别名会被替换成目标类型名称,而预处理器宏会被替换成目标文本。

类型别名与预处理宏的差异

1.语义区别:类型别名是类型系统的一部分,它定义了新的类型名称。预处理器宏只是简单的文本替换,它不属于类型系统。

2.作用范围:类型别名只能在当前作用域内使用,而预处理器宏可以在整个程序中使用。

3.类型检查:类型别名在编译时会进行类型检查,以确保使用类型别名的地方与目标类型名称兼容。预处理器宏不会进行类型检查,因此它可以用于替换任何文本。

4.代码可读性:类型别名可以提高源代码的可读性,因为它可以使源代码中的类型名称更加简洁和清晰。预处理器宏可能会降低源代码的可读性,因为它可能会导致源代码中出现难以理解的文本替换。类型别名与预处理宏的异同比较

#相同点

-语法结构:类型别名和预处理宏都使用相同的语法结构`typedef`和`#define`,分别用于定义类型别名和预处理宏。

-文本替换:类型别名和预处理宏都可以在编译阶段进行文本替换,从而实现代码的复用和簡化。

-宏定义:类型别名和预处理宏都可以用于定义宏,宏在编译阶段被展开,从而将宏替换为实际的代码。

-预处理阶段:类型别名和预处理宏都在预处理阶段进行处理,在编译器开始编译代码之前。

#不同点

-作用范围:类型别名是编译器级别的,只能在当前的文件中使用,而预处理宏是预处理级别的,可以在整个项目中使用。

-类型安全:类型别名是类型安全的,即它只能用于定义新的类型,而预处理宏不是类型安全的,它可以用于定义任何类型的符号。

-展开方式:类型别名在编译时展开,而预处理宏在预处理时展开。

-替代名称:类型别名可以用于替代类型的名称,而预处理宏可以用于替代任何标识符的名称。

-编译器支持:所有编译器都支持类型别名,而预处理宏则需要编译器的支持。

#总结

类型别名和预处理宏都是用于代码复用和简化的工具,但它们之间存在一些差异。类型别名是编译器级别的,只能在当前的文件中使用,并且是类型安全的。预处理宏是预处理级别的,可以在整个项目中使用,但不是类型安全的。类型别名在编译时展开,而预处理宏在预处理时展开。类型别名可以用于替代类型的名称,而预处理宏可以用于替代任何标识符的名称。所有编译器都支持类型别名,而预处理宏则需要编译器的支持。第七部分类型别名的使用注意事项和局限性。关键词关键要点【类型别名与泛型类型实例化的混用】:

1.类型别名可以与泛型类型实例化结合使用,以简化代码并提高可读性。

2.在某些情况下,类型别名可以帮助编译器进行类型推断,从而提高代码的可维护性。

3.但是,并非所有情况下都适合使用类型别名,在某些情况下,使用类型别名可能会使代码更加难以理解和维护。

【类型别名的潜在陷阱】:

类型别名的使用注意事项和局限性

类型别名是一种强大的工具,可以提高代码的可读性和可维护性。然而,在使用类型别名时也需要注意一些事项。

1.类型别名不能用于泛型类型

类型别名不能用于泛型类型,因为泛型类型需要在使用时指定具体的类型参数。例如,以下代码是错误的:

```

typeList<T>=Array<T>;

constnumbers:List<number>=[1,2,3];

```

上面的代码错误,因为`List<T>`是一个泛型类型,需要在使用时指定具体的类型参数。正确的写法是:

```

typeList<T>=Array<T>;

constnumbers:List<number>=[1,2,3];

```

2.类型别名不能用于联合类型

类型别名不能用于联合类型,因为联合类型需要在使用时指定具体的类型。例如,以下代码是错误的:

```

typeNumberOrString=number|string;

constvalue:NumberOrString=1;

```

上面的代码错误,因为`NumberOrString`是一个联合类型,需要在使用时指定具体的类型。正确的写法是:

```

typeNumberOrString=number|string;

constvalue:NumberOrString=1;

```

3.类型别名不能用于交叉类型

类型别名不能用于交叉类型,因为交叉类型需要在使用时指定具体的类型。例如,以下代码是错误的:

```

name:string;

age:number;

};

salary:number;

};

typePersonAndEmployee=Person&Employee;

name:'John',

age:30,

salary:10000

};

```

上面的代码错误,因为`PersonAndEmployee`是一个交叉类型,需要在使用时指定具体的类型。正确的写法是:

```

name:string;

age:number;

};

salary:number;

};

typePersonAndEmployee=Person&Employee;

name:'John',

age:30,

salary:10000

};

```

4.类型别名不能用于索引类型

类型别名不能用于索引类型,因为索引类型需要在使用时指定具体的索引类型。例如,以下代码是错误的:

```

[key:string]:number;

};

'name':1,

'age':2

};

```

上面的代码错误,因为`IndexType`是一个索引类型,需要在使用时指定具体的索引类型。正确的写法是:

```

[key:string]:number;

};

'name':1,

'age':2

};

```

5.类型别名不能用于泛型约束

类型别名不能用于泛型约束,因为泛型约束需要在使用时指定具体的类型。例如,以下代码是错误的:

```

typeT<Textendsstring>=T;

constvalue:T<string>=1;

```

上面的代码错误,因为`T<Textendsstring>`是一个泛型约束,需要在使用时指定具体的类型。正确的写法是:

```

typeT<Textendsstring>=T;

constvalue:T<string>='John';

```

6.类型别名不能用于类型断言

类型别名不能用于类型断言,因为类型断言需要在使用时指定具体的类型。例如,以下代码是错误的:

```

constvalue=1asstring;

```

上面的代码错误,因为`asstring`是一个类型断言,需要在使用时指定具体的类型。正确的写法是:

```

constvalue='1'asstring;

```

总结

类型别名是一种强大的工具,可以提高代码的可读性和可维护性。然而,在使用类型别名时也需要注意一些事项。这些事项包括:

*类型别名不能用于泛型类型

*类型别名不能用于联合类型

*类型别名不能用于交叉类型

*类型别名不能用于索引类型

*类型别名不能用于泛型约束

*类型别名不能用于类型断言第八部分类型别名在实际项目中的应用实例。关键词关键要点泛型技术在TypeScript中的应用,

1.泛型技术允许在定义函数、类或接口时使用参数化的类型,从而实现代码复用和类型安全。

2.类型别名可以用来定义泛型类型的别名,从而简化代码。

3.类型别名可以用来创建新的类型,从而实现代码重构和模块化。

泛型技术在Java中的应用,

1.泛型技术允许在定义类、接口和方法时使用参数化的类型,从而实现代码复用和类型安全。

2.类型别名可以用来定义泛型类型的别名,从而简化代码。

3.类型别名可以用来创建新的类型,从而实现代码重构和模块化。

泛型技术在C#中的应用,

1.泛型技术允许在定义类、接口和方法时使用参数化的类型,从而实现代码复用和类型安全。

2.类型别名可以用来定义泛型类型的别名,从而简化代码。

3.类型别名可以用来创建新的类型,从而实现代码重构和模块化。

泛型技术在Python中的应用,

1.泛型技术允许在定义类和函数时使用参数化的类型,从而实现代码复用和类型安全。

2.类型别名可以用来定义泛型类型的别名,从而简化代码。

3.类型别名可以用来创建新的类型,从而实现代码重构和模块化。

泛型技术在Go中的应用,

1.泛型技术允许在定义类型、函数和方法时使用参数化的类型,从而实现代码复用和类型安全。

2.类型别名可以用来定义泛型类型的别名,从而简化代码。

3.类型别名可以用来创建新的类型,从而实现代码重构和模块化。

泛型技术在Swift中的应用,

1.泛型技术允许在定义类、结构体、枚举和协议时使用参数化的类型,从而实现代码复用和类型安全。

2.类型别名可以用来定义泛型类型的别名,从而简化代码。

3.类型别名可以用来创建新的类型,从而实现代码重构和模块化。#类型别名在实际项目中的应用实例

类型别名是一种给类型起别名的语法特性,它允许开发者使用更具描述性的名称来表示类型,从而提高代码的可读性

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论