C♯, C#相談室 Part34

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2008/04/27(日) 21:17:15
>>927
俺の親はVBといえばVentureBusinessだとか言ってた
953デフォルトの名無しさん:2008/04/27(日) 21:21:46
>>951
再現せんね。Vista/.NET 2.0SP1
Value未設定の場合に起動時にMaxValueに設定されるだけだ。
954デフォルトの名無しさん:2008/04/27(日) 21:22:48
あ、MaxValueじゃなくて今の日付の直近値か。
955951:2008/04/27(日) 21:33:02
>>953
ありがとうございます。

再度検証してみましたところ、下記の条件で再現しています。
条件:MinDate〜MaxDateの範囲に、今の日付が含まれないこと。

上記の範囲が今日の日付より昔の場合はMaxDateに
未来の場合はMinDateに、カレンダーを▼で表示する度に
強制的に設定されてしまいます。
956デフォルトの名無しさん:2008/04/27(日) 23:24:46
取りあえず本当に最小限でやってみろ
あとSP当たってる? 影響するかどうかはわからないけど
こんなのも見かけた
ttp://groups.google.co.jp/group/borland.public.delphi.nativeapi.win32/browse_thread/thread/981ce1712e1c46ab/e6e89b23f3e8d002#e6e89b23f3e8d002
957951:2008/04/28(月) 06:14:40
>>956
新規アプリで、DateTimePickerを配置(&MaxDate、MinDate設定)
しただけでも同じ現象が起こりました。

SPは
Microsoft Visual Studio 2005 Standard Edition 日本語 Service Pack 1 (KB926602)
Windows2000で開発・ビルドしています。
ちなみに、テスト環境のVistaにはVisualStdioはインストールしていません。
.NetFrameworkのバージョンは3.0でも3.5でも同じ現象が出ます。

リンク先はdelphiですが、同様の現象みたいですね…
958デフォルトの名無しさん:2008/04/28(月) 09:17:26
デバッグだと20kのexeが発行すると全部で500kになっちゃうんだけど
20kのexeだけを配布しても問題ないよね?
959デフォルトの名無しさん:2008/04/29(火) 13:32:18
デバッグ版配布すんなw
960デフォルトの名無しさん:2008/04/29(火) 22:23:59
DbConnection conn = new OleDbConnection(string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=・・・");
DbCommand command = conn.CreateCommand();
command.CommandText = query; 
DbDataReader reader = command.ExecuteReader();
while (reader.Read()) {
  int n = reader[0]; // ココ
}

↑みたいな感じで、AccessのmdbファイルにOleDbで接続して、読み込んでいるのだけど、
「ココ」のところの「reader[0]」が、全部文字列を返します。

odbc経由で、下のようなSQLを流して、数値型で作った項目もです。

CREATE TABLE hoge (
  N INTEGER
)

oracle + VB.NET2003で、同じような感じで読みこんだときには、とうぜん数値の項目は数値で、文字列は文字列で
帰ってきました。

mdb(Jet)だと、これで正しい動作なんでしょうか?
それとも自分がどこか間違ってますか?

961デフォルトの名無しさん:2008/04/29(火) 22:44:12
それはどっちかっつとDB板とかで聞いた方がいんじゃね
DB関係のトラブルて大抵環境だし
962デフォルトの名無しさん:2008/04/30(水) 00:18:13
>>960
DB板はどっちかというとアドミン系の人が多いし、
そういったプログラミング系のは、こっちのスレで聞いた方がいいかも。

データベースプログラミング全般スレ
http://pc11.2ch.net/test/read.cgi/tech/1097295557/

一見、過疎ってるように見えるが、自分が質問したときは直ぐに教えて貰えたし。
963デフォルトの名無しさん:2008/04/30(水) 00:51:06
>>960
普通は全部文字列=StringじゃなくObject型だっと思うが?

全てInt32型なら
int n = reader.GetInt32(0);
でおkと思うよ
もしくは
int n = (int)reader[0];
とか
964デフォルトの名無しさん:2008/04/30(水) 23:39:22
スマソ。
>>960 のコードじゃ問題はなかった。(説明用に書いたコードで実際にバグの出てるコードとは違う)

reader[0] まではしっかりDBの型が保存されてて、(int)reader[0]とかやっても、問題ありませんでした。

readerの内容をDataTableに移し変えて、ロジック部分ではそれを利用してたのだけど、移し変える方法が
まずくて、全部文字列に変化してました。

実際はこういう感じのコードでした。

DataTable table = ExecReader("SELECT ・・・"); // SQLを投げると、結果をDataTableに入れて返す関数
DataRow row = table.Rows[0];
(int)row["hoge"]; // ここでキャスト失敗の例外発生
965デフォルトの名無しさん:2008/04/30(水) 23:44:07
> readerの内容をDataTableに移し変えて、
なぜ素直にFillしないんだろう
966デフォルトの名無しさん:2008/04/30(水) 23:48:09
rowに入れるんなら.ToString()付けるかConvart.ToIntじゃないか
967デフォルトの名無しさん:2008/05/01(木) 16:35:59
誰か、より良い方法があったら教えてください。
// 何箇所も変更場所があるのは好ましくない
class MyComponent1
{
 string myProperty = "初期文字列";
 [DefaultValue("初期文字列")]
 public string MyProperty { get { return myProperty; } set { myProperty = value; } }
 public MyComponent1() { }
}

// リファクタリングで MyProperty を書き換えると GetProperty("MyProperty") に変更が入らない
// 結局複数個所を書き換える方が見通しがいい
class MyComponent2
{
 string myProperty;
 [DefaultValue("初期文字列")] // ここを書き換えたら myProperty の初期値にも反映したい
 public string MyProperty { get { return myProperty; } set { myProperty = value; } }
 public MyComponent2()
 {
  var defaultValue = typeof(MyComponent2).GetProperty("MyProperty").GetCustomAttributes(typeof(DefaultValueAttribute), false)[0];
  myProperty = defaultValue.ToString();
 }
}
968デフォルトの名無しさん:2008/05/01(木) 16:36:43
ん、ここは偽スレ?
969デフォルトの名無しさん:2008/05/01(木) 16:49:22
スレを変えるなら両方で一言断っとけ
970デフォルトの名無しさん:2008/05/03(土) 13:18:17
Part46の偽スレで書いてしまったので、こちらで再投稿させてください

iTextSharp使ってテンプレート読込んだけれど、その後の文字描画がテンプレートの下に隠れてしまうが、
レイヤの順序を操作する方法とかあるのでしょうか?
テンプレート読込み後に文字描画しても、その逆でも同じように隠れますが。
971デフォルトの名無しさん:2008/05/03(土) 13:29:26
こっちは廃棄スレ
972デフォルトの名無しさん:2008/05/05(月) 06:22:48
もりあがってまいりました!
973デフォルトの名無しさん:2008/05/05(月) 20:42:47
次スレは↓でいいの?

C#, C♯, C#相談室 Part46
http://pc11.2ch.net/test/read.cgi/tech/1208791919/
974デフォルトの名無しさん:2008/05/05(月) 20:44:26
次スレというか本スレ
975デフォルトの名無しさん:2008/05/05(月) 20:49:38
2つ上のレスすら読めないってどんだけ〜
976デフォルトの名無しさん:2008/05/06(火) 00:49:36
俺に、C#習得者向けのC++の constについて教えてくれ。
C++のconstとかconstとかconstがよくわからない。
前はDelphiやってたからか余計に混乱する。

Effective C++とかModern C++ Designeとか読んでもモヤモヤする。
同じ職場の別プロジェクトのプログラマーはクラス全部(という表現がよいのかわからんが?)
constにしようと時間の無駄に気づかずやっきになっている。

C#風に言えばどうなんだ?
977デフォルトの名無しさん:2008/05/06(火) 00:51:17
引数にconstついているのに、プロパティに書き込みができたり、フィールドをいじることができたりすることが、
おかしい感覚らしい。
978デフォルトの名無しさん:2008/05/06(火) 01:35:54
C#でconstってほとんど出番無いよね
979デフォルトの名無しさん:2008/05/06(火) 01:40:51
>>976
const 使ってる既存のライブラリを利用する際に
問題が発生することがあるんだよ。
const 使わないやつは死刑だ。
980デフォルトの名無しさん:2008/05/06(火) 01:42:26
>>976
全部ってのはメンバ関数全部のことか、メンバ変数のことかどっちだ?
981デフォルトの名無しさん:2008/05/06(火) 02:36:25
C++ではconstには3種類あって、
・変数自身へのconst: 変数を変化しない/させない。定数。
・(ポインタの)ポイント先へのconst: そのポインタからは読み込みしかしない。
・メンバ関数に付く:そのメンバ関数からは(thisに対して)読み込みしかしない。
 で 、ここでmutableの登場。実装上は書くんだけど、意味的には読み込みだけ、みたいな
 (典型的にはキャッシュみたいな)メンバ変数に付けるとconstメンバ関数からも書ける。
982デフォルトの名無しさん:2008/05/06(火) 09:54:56
不変な値ってのには2つの意味があって、

1. 直定数(literal: 1 とか 0.5 みたいな数値)に名前が付いてるだけ。
 コンパイル結果がまさに定数。
2. コンパイラが不変な値と認識してるだけのもの。
 コンパイル結果は通常の変数と変わらないんだけど、
 プログラマが値を変更できないもの。

の2つある。
C# の const は 1 の意味でしか使えない。
readonly が 2 の意味に近いけど、readonly はプロパティとかを書きかえれちゃうんで不完全。

C++ の const は 2 の意味でも使える。
というか、大昔には 2 の意味でしか使えなかった(1 はマクロを使って定義)。
983デフォルトの名無しさん:2008/05/06(火) 10:04:04
>>982
素朴な疑問。
君のいう1と2の区別っていうのは

(a) Cではなくアセンブラレベルの話をしている場合
(b) ROMを持った環境の話をしている場合

でしか意味がない区別のように感じるけどどうなの。
984デフォルトの名無しさん:2008/05/06(火) 10:13:32
>>983
1 は配列の静的なサイズ指定に使えるが
2 は使えない。
985デフォルトの名無しさん:2008/05/06(火) 10:22:51
>>984
なるほど確かに。
986デフォルトの名無しさん:2008/05/06(火) 11:21:13
>>985
あと、まあ、Cみたいにパフォーマンスを気にする言語では、
コンパイル結果が定数になってるかどうかは結構重要。
load 命令が1個増えるだけで実行だいぶ遅くなるから。
987デフォルトの名無しさん:2008/05/06(火) 11:27:20
OOP が絡むとさらに複雑で、

- メモリが不変
- (メソッド呼び出しの結果が変わらないという意味で)
 外部から見て不変に見える

という区別も。
後者は、例えば最初に1回だけ計算して、その値をキャッシュしとくような場合、
外から見た値としては毎度同じ値しか返さない(=不変)なんだけど、
最初のキャッシュ計算のときにメモリ操作は発生しちゃう。

C++ の mutable キーワードはそういうときのためにある。
988デフォルトの名無しさん:2008/05/06(火) 23:02:52
で,複雑面倒な割に利点が少ないから捨てられた
989デフォルトの名無しさん:2008/05/06(火) 23:31:38
>>988
というか、学者肌の人間が導入したけど
実務上ほとんど使わないから一般プログラマーが見向きもしなかった
って感じじゃない?

言語マニアと一般人の温度差ってのはよくある話。
990デフォルトの名無しさん:2008/05/07(水) 07:54:41
メンバ関数のconstはメンバ関数のvolatileよりはだいぶ使われてる
991デフォルトの名無しさん:2008/05/07(水) 10:25:21
>>989
正確には >>982 の1の意味以外の const に意味がないことが判明したんだよ、メタメタしたプログラムを書きまくるなら、すぐに気づける
一切言語のキャスト等を一切使わず、言語の制約にも抵触せずに const 変数を書き換える大技がある、少し頭をひねってみると面白いよ。
constの意味は、自分でコードするときに、仕損じがないようにするためのお呪い以上の意味は無かったんだよ。
新しい言語では削除してしまうのが吉、ややこしくなるだけだから。
992デフォルトの名無しさん:2008/05/07(水) 13:27:22
リテラル以外の意味のconstが最低限必要な箇所というのは
文字列に関する部分で、char配列やstd:stringがそう。
多くの言語では文字列は特別な型として扱うことが多い。
C#やJavaは不変クラスで対応している。
それで必要がなくなった。
不変クラス文字列は文字を編集する操作には向かないが、
広く参照を分散させることやマルチスレッドに非常になじむという特徴を持っている。
993デフォルトの名無しさん:2008/05/07(水) 19:19:11
正直言って、C++勉強すれば良かった。
C#が出来たときに最先端と思って選んだけど
ネイティブコードを吐くC++の方が実用性がある
994デフォルトの名無しさん:2008/05/07(水) 19:46:34
仕損じがないようにするって、すげー重要なことだと思うんだがな・・・。
995デフォルトの名無しさん:2008/05/07(水) 20:19:28
だからって複雑にしすぎたら仕損じの余地が増える
996デフォルトの名無しさん:2008/05/07(水) 20:20:38
このくらいで複雑とか言ってたら
D 2.0 は扱えないぜ・・・
997デフォルトの名無しさん:2008/05/07(水) 20:34:41
あの本末転倒言語ですね
998デフォルトの名無しさん:2008/05/07(水) 20:41:46
あの D 2.0 の const まわりの仕様は流石になんとかして欲しい。
999デフォルトの名無しさん:2008/05/07(水) 20:45:49
隔離スレよ、さようなら
お次はココへ
C#, C♯, C#相談室 Part46
http://pc11.2ch.net/test/read.cgi/tech/1208791919/l50
1000デフォルトの名無しさん:2008/05/07(水) 20:46:33
::::::::::::::::::::::::::::::::::;.' .   ^堰@| +   ';:::::::::::::::::::::::
::::::::::::::::::::::::::::: ;.'     .| |     ';:::::::::::::::::::::
:::::::::::::::::::::::::::;.'         | |     ';:::::::::::::::::::
:::::::::::::::::::::: ;.'  ┼ i   亅_|, -、    ';:::::::::::::::::
::::::::::::::::::::;.'         厂/ ィ ⌒ヽ.  ';:::::::::::::::
::::::::::::::: ;.′      // .|rqミLノ_l | 〉  ';:::::::::::::
:::::::::::::;.'    ー匕 人公┘ ヒ}リ./ 厂}';::::::::::::
:::::::: ;.′       └冖ー> 、 n 火// .':::::::::::    輝かしい1000!
::::::;.'       ゜'    /.に二二二 イ>   ';::::::::
: ;.′       ,  ‐― 、:::{           ';::::::
:'      。  / .:!.:.i:|::ト、 \.ヘ.         ';::::
        ./ .:トLハ忙7| :l. Yヘ         ';::
        {j.:l:忙!   くノ .:.| ∧   ⊥   ';
    f^Y     礼_ ゥ イ .:.:.| ::∧   |
    二.二.rへ. 二.|厂〕 .:.|ーイ
  + o . .   └ヘ \/ /卜トゝ |    .  .
     :   :       \_/ |    .|  :    | :
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。