�@C#�̌���d�l�ɂ́A���2��ނ̃f�[�^�^��ϊ������i���p�ӂ���Ă���B1�̓L���X�g���Z�q�i�u()���Z�q�v�j�ŁA����1��as���Z�q�ł���B�ǂ�����g���Ă��A�f�[�^�^��ϊ����邱�Ƃ��ł���B
�@�܂��L���X�g���Z�q�ł͎��̂悤�ɂ��ċL�q����B
object obj = "������";
string str = (string)obj;
�@���̗�ł́Aobject�^�̎Q�Ƃɑ��āA“(string)”�Ƃ����\�L���g���āAstring�^�̎Q�Ƃɕϊ����Ă���B
�@����ɑ���as���Z�q�ł͎��̂悤�ɋL�q����B
object obj = "������";
string str = obj as string;
�@�����object�^�̎Q�Ƃ�string�^�̎Q�Ƃɕϊ����Ă���Bas���Z�q�ł́A���̎�O�ɕϊ��������Q�Ƃ��A���ɕϊ��������^���L�q����B�L���X�g���Z�q��as���Z�q�̕\�L�́A�܂���������Č����邪�A���ꂼ��̃R�[�h�����s�������ʂ͓������̂ƂȂ�B
�@�Ȃ��A���m�ɂ́A�������object�^�ϐ��ɑ�����Ă���ŏ��̍s���ÖٓI�ȕϊ����s���Ă���Bobject�N���X�͕�����^�̃X�[�p�[�N���X�ł��邽�߁A���̂悤�ȑ���͈ÖٓI�ɍs����B
�@�L���X�g���Z�q��C����̗�������ޑ����̃v���O��������Ŏg�p�ł��AC#�v���O�����ł����p����Ă���B����ɑ��Aas���Z�q���g�p�����\�[�X�E�R�[�h���������邱�Ƃ͑����Ȃ��B�������A�L���X�g���Z�q�Ƃ͕ʂ�as���Z�q�����݂���̂ɂ́A����Ȃ�̗��R������B���҂́A�f�[�^�^��ϊ�����Ƃ����ړI�͎��Ă��邪�A�@�\�̏ڍׂ͓����ł͂Ȃ��B
�@��1�̑���́A�ϊ��ł��Ȃ��Ƃ��̋����̑���ł���B�ȉ��̃T���v���E�v���O����������ƁA���ꂪ�����邾�낤�B
// castandas.cs
using System;
class MyClass {
public static void Main() {
object obj = "������";
MyClass cls1 = obj as MyClass;
Console.WriteLine(cls1 == null);
// �o�́FTrue
try {
MyClass cls2 = (MyClass)obj;
} catch(InvalidCastException e) {
Console.WriteLine(e.ToString());
// �o�́F
// System.InvalidCastException: �w�肳�ꂽ�L���X�g�͗L���ł͂���܂���B
// at MyClass.Main()
}
}
}
// �R���p�C�����@�Fcsc castandas.cs
�@�����ł́Astring�^����MyClass�^�ւ́A�{���͕ϊ��s�\�ȕϊ������s�����Ă���B
�@�v���O�����ł́A�܂��Aas���Z�q�ɂ��ϊ����s���Ă���B���̌��ʁAcls1 == null�̎���True�ƕ\������Ă��邱�Ƃ��番����Ƃ���A�ϊ��ł��Ȃ��Ƃ��ɂ́Aas���Z�q�͌��ʂƂ���null��Ԃ��B����A�L���X�g���Z�q�ɂ��ϊ��ł́AInvalidCastException��O���L���b�`���Ă��邱�Ƃ��番����Ƃ���A�ϊ��ł��Ȃ��ꍇ�ɂ�System.InvalidCastException�Ƃ�����O�𓊂���B
�@�v���O�����̍\���I�ȓs����A�ϊ��ł��Ȃ����Ƃ�null�l�Œ��ׂ�����悢�ꍇ��as���Z�q�̕����g���₷�����낤�B����A��O�œ�������s�����悢�ꍇ�̓L���X�g���Z�q�̕����g���₷�����낤�B
�@�L���X�g���Z�q�́A�l�^�A�Q�ƌ^���킸�Ɏg�p�ł���B�������Aas���Z�q�́A�Q�ƌ^�ւ̕ϊ��݂̂��s�����Ƃ��ł���i�l�^�A�Q�ƌ^�̏ڍׂɂ��Ắu������ C#���� 5-6 �l�^�ƎQ�ƌ^�v���Q�Ɓj�B�܂�A���̃R�[�h�͐������R���p�C���ł���B
int i = (int)1;
�@���������̂悤�ɁAas���Z�q�Œl�^��int�^�ւ̕ϊ����s�����Ƃ��Ă���R�[�h�̓R���p�C���ł��Ȃ��B
int i = 1 as int;
�@���̃R�[�h���R���p�C�����悤�Ƃ���ƁA
as �I�y���[�^�͎Q�ƌ^�Ŏg�p���Ă������� ( 'int' �͒l�̌^�ł� )�B
�Ƃ����G���[���N���Ă��܂��Bas���Z�q�̌��ɂ͎Q�ƌ^�̌^�݂̂��L�q�ł���B�L���X�g���Z�q�ɂ͂��̂悤�Ȑ���͑��݂��Ȃ��B
�@�Ȃ��Aas���Z�q�́A�l�^�ւ̕ϊ��͂ł��Ȃ����A�l�^�̒l���{�b�N�X���ɂ���ĎQ�ƌ^�ɕϊ����邱�Ƃ͉\�ł���B
�@C#�ł́Aimplicit�L�[���[�h��explicit�L�[���[�h���g�p���āA�ÖٓI���邢�͖����I�ȃ��[�U�[��`�ϊ����L�q���邱�Ƃ��ł���i���[�U�[��`�ϊ��ɂ��Ắu������ C#���� Column�@- ���[�U�[��`�̃f�[�^�^�ϊ� -�v���Q�Ɓj�B�L���X�g���Z�q��p���āA���̃��[�U�[��`�ϊ������s�����邱�Ƃ��ł��邪�Aas���Z�q�ł͂ł��Ȃ��B
�@�Ⴆ�A����2�̃N���X������Ƃ��悤�B�������Ȃ��N���X�uClassDoNothing�v�ƁAoperator�L�[���[�h�ɂ��ClassDoNothing�N���X�Ƃ̊ԂŌ^�ϊ����s���@�\���܂ރN���X�uClassImplicit�v���B
class ClassDoNothing {
}
class ClassImplicit {
public static implicit operator
ClassImplicit(ClassDoNothing src) {
return new ClassImplicit();
}
}
�@������2�̃N���X�ɑ��āA���̂悤�ȃR�[�h���L�q�����Ƃ���B
ClassDoNothing cdn = new ClassDoNothing();
ClassImplicit ci1 = cdn as ClassImplicit;
�@���������̃R�[�h�́Aas���Z�q�̌��Ŏ��̂悤�ȃG���[���������A�R���p�C���ł��Ȃ��Bas���Z�q�́A���[�U�[��`�ϊ������s���Ȃ����߂ł���B
�r���g�C���ϊ��ŁA�^ 'ClassDoNothing' �� 'ClassImplicit' �ɕϊ��ł��܂���B
�@����A���̂悤�ȃL���X�g���Z�q�́A���[�U�[��`�ϊ��ɂ��ϊ��\�Ȃ̂ŁA���ɃG���[�ɂȂ炸�����\�ł���B
ClassDoNothing cdn = new ClassDoNothing();
ClassImplicit ci2 = (ClassImplicit)cdn;
�@����1�̒��ӂ��Ă������������̂́A���̂悤�ȏꍇ�ł���B
ClassDoNothing cdn = new ClassDoNothing();
ClassImplicit ci3 = cdn;
�@���̑���ɂ́A�L���X�g���Z�q�������ϊ��Ɋւ���w����������Ă��Ȃ��B����ɂ�������炸�G���[�ɂȂ�Ȃ��̂́A�����Ŏg�p���Ă��郆�[�U�[��`�ϊ���implicit�L�[���[�h���g�����ÖٓI�ȕϊ��ł��邽�߂ł���B����ɂ�薳�W�ł���N���X�ԂŁA�L���X�g���Z�q�Ȃǂ��L�q���邱�ƂȂ�������\�ɂȂ��Ă���̂��B�������A���̂悤�ȕϊ����\�ł���ł��A��q�����悤��as���Z�q�ɂ��ϊ��̓G���[�ɂȂ�B���Ȃ킿�Aas���Z�q�̓��[�U�[��`�̕ϊ������s�����ƍ���ꍇ�Ɏg�p����ƗL�p�ł���B
�@�����܂ł̐����ŁA�L���X�g���Z�q�Ɣ�r����as���Z�q�͎��s�ł���@�\�����Ȃ����Ƃ��������肾�낤���B���̂��Ƃ́A�P�Ȃ�f�����b�g����ł͂Ȃ��B���͋@�\�����Ȃ��������A�L���X�g���Z�q����as���Z�q��p�������������͍����ɂȂ�\�������݂���B�ȉ��́A�L���X�g���Z�q���g�p�����ꍇ�ƁAas���Z�q���g�p�����ꍇ�̑��x���r����T���v���E�v���O�����ł���B
// castbench.cs
using System;
class CastBench {
class Sample1 {
public int n = 1;
}
class Sample2 {
}
private static int testCast(object [] testdata) {
int sum = 0;
foreach (object o in testdata) {
try {
sum += ((Sample1)o).n;
} catch(InvalidCastException) {
sum += 1;
}
}
return sum;
}
private static int testAs(object [] testdata) {
int sum = 0;
foreach (object o in testdata) {
Sample1 s = o as Sample1;
if (s != null) {
sum += s.n;
} else {
sum += 1;
}
}
return sum;
}
private static int testIsCast(object [] testdata) {
int sum = 0;
foreach (object o in testdata) {
if (o is Sample1) {
sum += ((Sample1)o).n;
} else {
sum += 1;
}
}
return sum;
}
public static void Main() {
object [] testdata = new object[1000000];
for (int i = 0; i < testdata.Length; i++) {
if (i % 1000 != 0) {
testdata[i] = new Sample1();
} else {
testdata[i] = new Sample2();
}
}
DateTime startCast = DateTime.Now;
for (int i = 0; i < 1000; i++) testCast(testdata);
DateTime endCast = DateTime.Now;
Console.WriteLine("�L���X�g�̎��s���� {0}", endCast - startCast);
// �o�͗�F�L���X�g�̎��s���� 00:00:47.9899632
DateTime startAs = DateTime.Now;
for (int i = 0; i < 1000; i++) testAs(testdata);
DateTime endAs = DateTime.Now;
Console.WriteLine("as���Z�q�̎��s���� {0}", endAs - startAs);
// �o�͗�Fas���Z�q�̎��s���� 00:00:11.7771696
DateTime startIsCats = DateTime.Now;
for (int i = 0; i < 1000; i++) testIsCast(testdata);
DateTime endIsCast = DateTime.Now;
Console.WriteLine("is���Z�q+�L���X�g�̎��s���� {0}", endIsCast - startIsCats);
// �o�͗�Fis���Z�q+�L���X�g�̎��s���� 00:00:20.7702804
}
}
// �R���p�C�����@�Fcsc castbench.cs
�@�R�����g�Ƃ��ăv���O�������ɖ��ߍ����s���ʂ́A�M�҂̃R���s���[�^�iPentium4�^1.5GHz�̃V�X�e���j�Ŏ��s�����Ƃ��̂��̂ł���B���s������ɂ���āA�\�������o�ߎ��Ԃ͕ω�����\��������B
�@���̃T���v���E�v���O�����ł́ASample1�N���X��Sample2�N���X�̃C���X�^���X���܂�object�^�̔z���p�ӂ��Ă���B���̗�ł́A1000��1�̊����ŁA�ϊ������s����f�[�^���܂߂Ă���B�����āASample1�N���X�Ȃ烁���o�ϐ��̒l�����Z���A����ȊO�Ȃ�1�����Z���鏈�����s�����\�b�h���A�L���X�g���Z�q��as���Z�q�Ŏ������Ă݂��B�v���O�����ł�3�p�^�[���̌v�����s���Ă���B�ŏ��̃p�^�[�����L���X�g���Z�q�ɂ���ĉ��Z�������s����A2�ڂ̃p�^�[����as���Z�q�ɂ���ĉ��Z�������s����ł���B���s���ʂ����āA���҂̎��s���Ԃ��r����ƁAas���Z�q���g���������͂邩�ɍ����ł��邱�Ƃ�������B
�@�����ŁA��O�͏d�������ł����Ƃ��������ɋC�t�����ǎ҂́A�L���X�g���Z�q���g������͗�O���������Ă��邩��x���̂�������Ȃ��Ǝv������������Ȃ��B���ہA�ϊ��ł��Ȃ��f�[�^�̊����𑝂₹�Α��₷�قǁA�������Ԃ͑傫�������Ă��܂��̂ł���B�Ȃ�A��O���N���Ȃ��悤�ɏ�������L���X�g���Z�q���g���Ă��x���Ȃ�Ȃ���������Ȃ��A�ƍl����͓̂��R�̂��Ƃ��낤�B����ł͂Ƃ������ƂŁA�L���X�g���Z�q����O��is���Z�q�Ō^�肷��悤�ɂ����̂��A3�ڂ̃p�^�[���ł���B���̕����Ȃ��O�͓������Ȃ��B�������A���s���ʂ�����ƕ�����Ƃ���A�m���ɃL���X�g���Z�q���g�������\�b�h�����͂邩�ɍ����ɂȂ������Aas���Z�q���g�������\�b�h�ɔ�ׂ�Ƃ��Ȃ�x���B���̗��R�́Ais���Z�q�ƃL���X�g���Z�q�ɂ���āA2����f�[�^�^�̃`�F�b�N�����邱�ƂɂȂ�A�����S�̂Ƃ��Ă͏d���Ȃ��Ă��܂������߂ł͂Ȃ����ƍl������B
�@�܂��A�ϊ��ł��Ȃ��f�[�^���܂������܂܂Ȃ��z���p�ӂ��Ď��s�����Ă��A�L���X�g���Z�q���g�����\�b�h�����Aas���Z�q���g�����\�b�h�̕�����⍂���ł���B�@�\�����Ȃ��������Aas���Z�q�̕������������\�Ƃ������Ƃ��ł��邾�낤�B
�J�e�S���FC#�@�����ΏہF�^�ϊ�
�g�p�L�[���[�h�F�L���X�g���Z�q
�g�p�L�[���[�h�Fas���Z�q
�g�p�L�[���[�h�Fis���Z�q
�u.NET TIPS�v
Copyright© Digital Advantage Corp. All Rights Reserved.