ある変数が保持しているデータ型を調べるにはどうすればよいですか? (例:int、string、charなど)
私は今このようなものを持っています:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Testing
{
class Program
{
static void Main()
{
Person someone = new Person();
someone.setName(22);
int n = someone.getName();
Console.WriteLine(n.typeOf());
}
}
class Person
{
public int name;
public void setName(int name)
{
this.name = name;
}
public int getName()
{
return this.name;
}
}
}
この質問には他の回答も役立ちますが、重要な微妙な問題があり、どれも直接対処していません。 C#で型を考慮する方法は2つあります:静的型と実行時型。
静的型は、ソースコード内の変数の型です。したがって、これはコンパイル時の概念です。これは、開発環境で変数またはプロパティにカーソルを合わせたときにツールチップに表示されるタイプです。
実行時タイプは、メモリ内のオブジェクトのタイプです。したがって、これは実行時の概念です。これは、GetType()
メソッドによって返されるタイプです。
オブジェクトの実行時の型は、それを保持または返す変数、プロパティ、またはメソッドの静的な型とは異なることがよくあります。たとえば、次のようなコードを使用できます。
object o = "Some string";
変数の静的タイプはobject
ですが、実行時には、変数のreferentのタイプはstring
です。したがって、次の行は「System.String」をコンソールに出力します。
Console.WriteLine(o.GetType());
ただし、開発環境で変数o
にカーソルを合わせると、タイプSystem.Object
(または同等のobject
キーワード)が表示されます。
int
、double
、System.Guid
などの値型変数の場合、値型は常に静的型と同じになることがわかっています。これは、値型が別の型の基本クラス。値型は、その継承チェーンの中で最も派生した型であることが保証されています。これは、密封された参照型にも当てはまります。静的型が密封された参照型である場合、実行時の値はその型のインスタンスまたはnull
でなければなりません。
逆に、変数の静的型が抽象型の場合、静的型とランタイム型が異なることが保証されます。
コードでそれを説明するには:
// int is a value type
int i = 0;
// Prints True for any value of i
Console.WriteLine(i.GetType() == typeof(int));
// string is a sealed reference type
string s = "Foo";
// Prints True for any value of s
Console.WriteLine(s == null || s.GetType() == typeof(string));
// object is an unsealed reference type
object o = new FileInfo("C:\\f.txt");
// Prints False, but could be true for some values of o
Console.WriteLine(o == null || o.GetType() == typeof(object));
// FileSystemInfo is an abstract type
FileSystemInfo fsi = new DirectoryInfo("C:\\");
// Prints False for all non-null values of fsi
Console.WriteLine(fsi == null || fsi.GetType() == typeof(FileSystemInfo));
一般的に言えば、リフレクションやインターフェイスを使用して何かをしているのでなければ、型比較を行う必要はほとんどありません。それにもかかわらず:
比較するタイプがわかっている場合は、is
またはas
演算子を使用します。
if( unknownObject is TypeIKnow ) { // run code here
as
演算子は、例外ではなく失敗した場合にnullを返すキャストを実行します。
TypeIKnow typed = unknownObject as TypeIKnow;
型がわからず、実行時の型情報だけが必要な場合は、.GetType()メソッドを使用します。
Type typeInformation = unknownObject.GetType();
C#の新しいバージョンでは、is
演算子を使用して、as
を使用せずに変数を宣言できます。
if( unknownObject is TypeIKnow knownObject ) {
knownObject.SomeMember();
}
以前は、これを行う必要がありました。
TypeIKnow knownObject;
if( (knownObject = unknownObject as TypeIKnow) != null ) {
knownObject.SomeMember();
}
その非常にシンプルな
variable.GetType().Name
変数のデータ型を返します
GetType()メソッドを使用します
http://msdn.Microsoft.com/en-us/library/system.object.gettype.aspx
興味のあるメンバーにカーソルを合わせると、ツールチップが表示されます。メンバーのタイプが表示されます。
1つのオプションは、次のようなヘルパー拡張メソッドを使用することです。
public static class MyExtensions
{
public static System.Type Type<T>(this T v)=>typeof(T);
}
var i=0;
console.WriteLine(i.Type().FullName);
PHPとC#は構文的には関連していますが、まったく異なりますが、質問には額面で答えることができます(この記事を参照してください http://msdn.Microsoft.com/en-us/library/58918ffs(v = vs.71 ).aspx )Jeffrey RichterによるC#(第3版または第2版)を介してCLRのコピーを入手して読むことを強くお勧めします。プログラミングに関連した最高の本で、これまで読んだことがあると思いますが、ほとんどすべてのタイプ関連の質問に答え、フードの下で何が起こっているのかを非常に深く理解するでしょう!
GetType()
メソッド
int n=34;
Console.WriteLine(n.GetType());
string name="Smome";
Console.WriteLine(name.GetType());
これを行う簡単な方法の1つをチェックしてください
// Read string from console
string line = Console.ReadLine();
int valueInt;
float valueFloat;
if (int.TryParse(line, out valueInt)) // Try to parse the string as an integer
{
Console.Write("This input is of type Integer.");
}
else if (float.TryParse(line, out valueFloat))
{
Console.Write("This input is of type Float.");
}
else
{
Console.WriteLine("This input is of type string.");
}