问答原文:
string[] a;
int[] b;
// 这样可以判断,但是不是我想要的写法,因为is判断不仅限于类型相等,前者是后者的子类也返回true
// 虽然Array不会有子类,但是我希望写法和其他代码统一风格
if (a is Array){ .... // true
if (b is Array){ .... // true
// 我想要类似这样的写法
if (a.GetType() == typeof(Array)){ .... // false
// 但==左边是String[],右边是System.Array,等式不成立
// 我又不能写成
if (a.GetType() == typeof(string[])){ ... // true
// 因为不仅仅是string数组,int数组,其他数组都希望被检查出来
// 用object[]也不行
if (a.GetType() == typeof(object[])){ ... // false
我的解答:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace TypeCheck
{
class Program
{
static void Main(string[] args)
{
string[] b = new string[] {"1", "2", "3"};
Console.WriteLine(typeof(string[]));
Console.WriteLine("The type is {0}", b.GetType());
if (b.GetType().IsArray)
Console.WriteLine("Its true");
else
Console.WriteLine("ITs false");
if (b.GetType() == typeof(string[]))
{
Console.WriteLine("true");
}
else
{
Console.WriteLine("false");
}
Console.Read();
}
}
}
RednaxelaFX的答案:
using System;
static class Demo {
static bool IsArray(this object o) {
return o is Array;
}
static bool IsArray2(this object o) {
if (null == o) return false;
return o.GetType().BaseType == typeof(Array);
}
static void Main(string[] args) {
Console.WriteLine("args is array: {0}", args.IsArray());
Console.WriteLine("args is array: {0}", args.IsArray2());
}
}
分享到:
相关推荐
首先,我们需要在Oracle数据库中定义UDT,例如一个包含多个元素的数组类型。这可以通过PL/SQL语句完成,如: ```sql CREATE OR REPLACE TYPE my_array_type AS TABLE OF VARCHAR2(100); ``` 然后,在C#项目中,...
此外,还定义了一个名为`GetDeviceIdList`的函数,它接收一个`DEVICE_INFO`结构体数组的指针以及一个整型引用`count`作为参数。 #### C#中的结构体定义 接下来,在C#中定义相应的结构体以匹配C++中的定义: ```...
转向C#,C#中的数据传递始终是通过引用进行的,即使对于基本类型,也会创建一个装箱对象。数组在C#中也是对象,所以传递数组参数实际上是在传递数组的引用。这与C++的行为相似,但在C#中,这种行为是默认的,无需...
例如,`T[,] array`定义了一个类型为`T`的二维数组。 要对二维数组进行排序,我们不能直接使用C#内置的排序方法,如`Array.Sort()`,因为它们通常适用于一维数组。对于二维数组,我们需要自定义排序逻辑。文中提供...
在C#中,动态声明一个对象数组通常涉及使用new运算符和System.Collections.ArrayList类,或者使用泛型的List类。以下是一个使用ArrayList的例子: ```csharp ArrayList array = new ArrayList(); array.Add(new ...
首先,我们来看一下C#中的数组类型。在C#中,数组分为一维数组、二维数组以及多维数组。一维数组是最简单的形式,类似于线性的数据结构,可以理解为一个有固定长度的序列。例如,`int[] numbers = new int[5];` 创建...
System.Collections.ArrayList 是 C# 中的一个集合类,它可以存储不同类型的元素。 C# 数组在内存中的结构是连续的,数组的每个元素占用固定大小的内存空间。数组的元素可以通过下标访问,下标从 0 开始。 C# 支持...
C#中的字符串是引用类型,由.NET框架管理,而C++中的字符串可以是字符数组(char*)或宽字符数组(wchar_t*)。因此,传递字符串数组时,需要进行适当的类型转换。 1. **定义C++ DLL接口**: 在C++ DLL中,我们...
在C#编程语言中,数组是存储相同类型数据的基本结构之一,它们被广泛应用于各种场景。根据不同的需求,C#提供了多种类型的数组,包括一维数组、交错数组...开发者应根据实际情况权衡各种因素,选择最适合的数组类型。
总的来说,掌握C#的基础知识和编程规范,特别是数组的使用,对于成为一个合格的C#开发者至关重要。理解类和接口、虚方法和抽象方法、值类型和引用类型之间的关系,以及如何利用各种集合类和正则表达式解决问题,将使...
本篇将详细讲解如何在C#中调用一个包含二维数组的C++DLL。 首先,我们需要了解C#与C++之间的互操作性依赖于.NET框架提供的`Platform Invoke (P/Invoke)`机制。P/Invoke允许C#代码直接调用非托管(如C++)代码,并...
3. **字节数组转结构体**:创建一个方法将字节数组还原为结构体。 ```csharp public static MyStruct ByteArrayToStruct(byte[] byteArray) { GCHandle handle = GCHandle.Alloc(byteArray, GCHandleType.Pinned); ...
这意味着,当我们传递一个引用类型的参数到方法中,或者将其赋值给另一个变量时,传递或复制的是对象的引用,而非对象本身。这种机制下,修改通过引用传递的对象会影响到原始对象的状态,因此在处理大对象或需要避免...
这意味着当你创建一个引用类型的实例时,它会分配在堆内存中,并且变量只包含一个指向这个堆内存地址的引用。 #### 二、引用类型赋值过程解析 当我们对引用类型的变量进行赋值操作时,实际上是将源变量所指向的...
在某些性能敏感的场景下,C#提供了一种称为固定大小的缓冲区的特殊数组类型,它能提供更高效的访问方式。例如: ```csharp unsafe { fixed (int* buffer = &numbers[0]) { // 使用指针访问缓冲区 } } ``` ...
* 值类型的变量赋值会创建所赋的值的一个副本,而用类型的变量赋值复制的是引用而不是由引用标识的对象。 * 任何类型都不可能从值类型派生,因此,所有值类型都是隐式密封的。 通过本资源摘要信息,读者可以对C#...
C#中的数组是一种存储同一类型数据的集合,它提供了一种高效且有序的方式来管理大量数据。数组分为一维数组、二维数组甚至多维数组,它们是C#编程基础中的重要组成部分。 一维数组是最简单的形式,它就像一条线性的...
这里的`CallbackFunc`是函数指针类型,它接受一个字符串和一个整型数组作为参数。 2. **C#中的委托类型**:在C#中,我们需要创建一个与C++回调函数匹配的委托类型。 ```csharp public delegate void ...
引用类型(Reference Types)包括类(class)、接口(interface)、数组和委托(delegate)。引用类型在内存中存储的是对象的引用,而不是实际的数据。当变量赋值或传递给函数时,传递的是对同一块内存区域的引用,...