X



C#, C♯, C#相談室 Part93©2ch.net
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 1e06-m8Mb)
垢版 |
2017/04/22(土) 08:52:00.93ID:iVvswOrb0
■Visual Studio 2017 Community(無償の統合開発環境)等はこちら
http://www.visualstudio.com/downloads/

■コードを貼る場合はこちら
http://ideone.com/

■前スレ
C#, C♯, C#相談室 Part92
http://echo.2ch.net/test/read.cgi/tech/1485589613/

■次スレは>>970が建てる事。
建てられない場合は他を指定する事。
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0854デフォルトの名無しさん (ワッチョイ 4690-Bwin)
垢版 |
2019/02/10(日) 18:57:09.81ID:ynO2ssbq0
参照値でも、refつけない値渡しとref付ける参照渡しできる。
で、参照値以外の値...とりあえず非参照値と呼ぶと
非参照値でも、refつけない値渡しとref付ける参照渡しできる。

全部で4パターンあるってこと 👀
Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b)
0855デフォルトの名無しさん (アウアウエー Sa0a-gVV1)
垢版 |
2019/02/10(日) 19:18:44.11ID:zgWWffC0a
>>850
簡単なので難しく考えてはだめ。すごくシンプルな話。

その型の値(その型の変数に格納される値)を渡すのが値渡し。
その型の変数の「場所」を渡すのが参照渡し。
さらっと書いたけど、「その型の値 = その型の変数に格納される値」なのはよく理解する必要がある。
つまり、参照型の変数に格納される値って何だったか要再考。

変数とはメモリ上に割り当てられた特定の領域のこと。
だからその領域のバイト列のコピーを渡すのが値渡しで、
領域の先頭アドレスを渡すのが参照渡しだと思えばいい。

参照渡しでメソッドが受け取る情報は「変数の」場所なので、参照渡しの引数に
リテラルや式を渡すことは出来ない。
0856デフォルトの名無しさん (ワッチョイ 6ea5-sQyl)
垢版 |
2019/02/10(日) 19:59:44.58ID:xbk//Ba50
多分だけど参照渡しと値渡しの挙動自体は理解しているものの、
デフォ参照型とデフォ値型の区別がついておらずにデフォ参照型で実験をしてrefでも素渡しでも変わらないやんってことじゃないか
0867デフォルトの名無しさん (ワッチョイ 4690-Bwin)
垢版 |
2019/02/11(月) 18:26:18.92ID:2ERt5pT00
そのswapがな、MVVMでお決まりのBindableBaseなりのSetPropertyでプロパティの値交換するときに使いまくりで、
androidでもMVVM使いまくってるけどrefないkotlinやjavaでやると...
0870デフォルトの名無しさん (ワッチョイ cd0c-feI+)
垢版 |
2019/02/12(火) 23:51:08.44ID:HQcd2HqP0
BindableBase SetPropertyとかでぐぐってみれ
有り体に言えば自身のプロパティ(のバックストア)を差し替えるジェネリックメソッドを基底クラスで定義するのに使うだけ
0871デフォルトの名無しさん (ワッチョイ f901-OF6d)
垢版 |
2019/02/13(水) 00:40:04.33ID:6JezjdzR0
WPFとかUWPとか使ってればBindableBaseのありがたさはよくわかる

関係ないけどstaticメソッドって呼び出すときにいちいちインスタンスを生成する必要がないって以外のメリットあるのかな?
0872デフォルトの名無しさん (アウアウエー Sa0a-gVV1)
垢版 |
2019/02/13(水) 01:53:30.80ID:sK/raQIQa
>>871
まあメリットって発想がそもそもおかしい。
例えばDouble.Parseがstaticなのはその方が意味的に自然だから
インスタンスメソッドである必然性がないし、インスタンスメソッドでは不自然だから
0881デフォルトの名無しさん (アウアウカー Sa5b-KHu+)
垢版 |
2019/02/15(金) 22:47:38.37ID:izkrr7dEa
いやチェックしとけよそこは
0887デフォルトの名無しさん (ワッチョイ 5f01-3Kdw)
垢版 |
2019/02/16(土) 13:08:53.78ID:q1DAaOKG0
>>883
> 例外っていろんな種類あるけど具体的に何を使えばいいのかよくわからなくて
投げる方で悩むのはわかるけど
> とりあえずcatch(Exception e)とかしちゃってる
受ける方はどれ受けるべきかはわかってるでしょ
最終手段としてよくわからんけどエラーが発生したから終了するね
って言うならcatch(Exception e)もありだと思うが
0892デフォルトの名無しさん (オイコラミネオ MMdb-XSOg)
垢版 |
2019/02/16(土) 15:03:48.09ID:uy2P96bkM
最近部活の後輩が黒魔術みたいなコードを書くようになって困ってるんだが対策ない?

こんな感じのコードを後輩が書いてくるんだよ↓

public interface IMessenger {
__public MessageReceived();
}
public abstract class Messenger : IMessenger{
__public abstract void MessageReceived();
__public abstract void Retry();
}
0893デフォルトの名無しさん (オイコラミネオ MMdb-XSOg)
垢版 |
2019/02/16(土) 15:04:05.72ID:uy2P96bkM
public class Mail : Messenger {
__public override void MessageReceived(){
____//処理
__}
__public override void Retry(){
____//処理
__}
}
public class Alarm : Messenger {
__public override void MessageReceived(){
____//処理
__}
__public override void Retry(){
____//処理
__}
}
public class Communication {
__public void SendMessage(IMesssenger message){
____SendMessage(message);
__}
__public void Received(){
____var received = GetMessage() as IMessage;
____received?.MessageReceived();
__}
}
0894デフォルトの名無しさん (オイコラミネオ MMdb-XSOg)
垢版 |
2019/02/16(土) 15:04:31.94ID:uy2P96bkM
こんなんだったから

public class Communication{
__public void SendMessage(string message){
____SendMessage(message);
__}
__public void Received(){
____var received = GetMessage();
______switch(received.First()){
_______case "0":
_________MailEvent(received);
_________break;
_______case "1":
_________AlermEvent(received);
_________break
____}
__}
}

こんな感じで書くように矯正しといた
CSVで2文字で分けるって言ってるんだから
何が起こってるかわかるように書くことを意識してもらわないと
0895デフォルトの名無しさん (ワッチョイ c701-cT+3)
垢版 |
2019/02/16(土) 15:06:36.58ID:8cj+4+Hl0
まあ例外でプログラムは終了させるべきだよな
ただ客は例外が起きてもcatchで握りつぶしてスルーした方が文句言わないんだよな……
0901デフォルトの名無しさん (ワッチョイ 7fa7-cT+3)
垢版 |
2019/02/17(日) 14:42:24.50ID:QIeMqQFm0
byte*からbyte[]にする方法ってない?
new byte[64];みたいに新規確保してコピーしか方法ないんだろうか
Unsafe.As等で新規確保無しで出来るかと思って色々試してみたけど上手くいかない
0902デフォルトの名無しさん (アウアウエー Sa1f-x6Gg)
垢版 |
2019/02/17(日) 15:01:42.36ID:99sHKv96a
「byte[]にする」が「byte[]とみなして扱えるようにする」って意味なら
全然別の型なんだしあるわけないでしょう。
そういう危なっかしい機能を排除してるのがC#の売りの一つだったはずなわけで

コピーする機能ならMarshalあたりにあるんじゃない?
0903デフォルトの名無しさん (ワッチョイ 7fa7-cT+3)
垢版 |
2019/02/17(日) 15:16:25.11ID:QIeMqQFm0
>>902
>「byte[]にする」が「byte[]とみなして扱えるようにする」って意味なら
そういうことです

あるわけないと言いますが、その逆はあるので出来るかなと思い
(byte*やref byteで先頭を指定し自作のstructとして読ませる。少しずらせばbyte[]を自作クラスとして読ませることも可能)
0906デフォルトの名無しさん (ワッチョイ 7fa7-cT+3)
垢版 |
2019/02/17(日) 15:27:09.29ID:QIeMqQFm0
>>904
public struct MyStruct { public int Value1, Value2, Value3, Value4 };
byte[] data = new byte[16] { 1,0,0,0, 2,0,0,0, 3,0,0,0, 4,0,0,0 };
ref var myStruct = ref Unsafe.As<byte, MyStruct>(ref data[0]);
これでmyStruct .Value1は1、myStruct .Value2は2, myStruct .Value3は3, myStruct .Value4は4と余計なコピー無しに直接読み書きできる

byte[]からclassの場合はFieldOffset指定して各フィールドを4バイト後ろにづらないと出来ないから実用は難しいけど一応可能
0910デフォルトの名無しさん (ワッチョイ df32-A2tD)
垢版 |
2019/02/17(日) 16:27:59.23ID:tKx1WgvG0
byte[]も参照型だからね、オブジェクトヘッダが付いてなければ扱えない
Span<T>でなければ、具体的なシナリオにも依るけど元からbyte[]で作って
TypeHandleとlengthのsizeof(IntPtr)*2分ずらした所を使い回す方が賢明
結局fiexdと一緒な訳だが、P/Invokeならbyte[]渡してもゼロコピーの筈だし

abstract class Union<T> where T : struct {
internal readonly IntPtr length;
public T Value;
}
みたいなオレオレ実装をILキャストした事もあったな…後はSafeBufferとか
0911デフォルトの名無しさん (アウアウウー Sa21-eq4B)
垢版 |
2019/02/21(木) 12:35:31.38ID:78/oBfjca
self containedって完全に依存なしになるわけじゃないのね
alpine用にself containedでビルドしても動かなかった
libstdc++とか色々インストールしたら動いたけどさ
dotnetコマンド同梱と比較してコンテナサイズも殆ど変わらないし意味あるのかなこれ
0913デフォルトの名無しさん (ササクッテロレ Spbd-zZPo)
垢版 |
2019/02/21(木) 14:33:57.39ID:XSMrGlqdp
SCDは.NETのランタイムを別途インストールじゃなくて同梱するってだけの話だしね
公式ドキュメントにも注釈あるけどLinuxは仕様上完全に断ち切るのは難しいんじゃない?
Windowsだと同梱のファイルだけでそのまま動くけど
0918デフォルトの名無しさん (ワッチョイ 5d2d-4qoz)
垢版 |
2019/02/26(火) 16:27:59.06ID:jgGxVc0K0
ちょくちょくポインタ代替機能についての質問があるけどさ
どんな用途でポインタを使いたいのかわかんないけど、大抵の場合はストリームで代用できるんじゃないのかな
0922デフォルトの名無しさん (ワッチョイ 6d7b-SpKW)
垢版 |
2019/02/27(水) 22:56:28.74ID:0yfFFlZD0
ポインタなんかアンマネージとのやり取りとBitmapdataでしか使ったことないな
アンマネージとのやり取りだとrefとかoutにしとけばあとは何も考えなくていいから助かる
0932デフォルトの名無しさん (ワッチョイ ffa7-3oSp)
垢版 |
2019/03/02(土) 20:18:35.52ID:zHCAEP8E0
>>928
HashSetやDictionaryは要素の数に左右されない方法でアクセスを行うから
含まれてるか否かといったような検索用途に限定すれば1個だろうが1万個だろうが常に高速にアクセス出来る
Listや配列は要素数に比例してアクセス時間かかるようになるが
0935デフォルトの名無しさん (ワッチョイ 9f2f-nxCI)
垢版 |
2019/03/03(日) 01:24:26.71ID:5kU0Dorz0
>>932
もとの要素がどこにあるかよくわからんけどな
HashSet作成して要素セットするオーバーヘッドがあるだろう
格納時にハッシュ値計算するから比較のコストが低いわけで、その分格納にコストがかかるんだぜ
0938デフォルトの名無しさん (ワッチョイ 179f-bDR4)
垢版 |
2019/03/03(日) 09:05:10.09ID:wNoJ2Bbs0
質問者ってそんなに偉いの?
そいつの質問に常に合致した話題じゃなきゃダメなの?
ひとつの質問があって、それを機会に派生してもいいし、あとは自由に意見しあえってもいい

どんだけ構ってほしいんだ
0940デフォルトの名無しさん (アウアウカー Sa6b-u4yZ)
垢版 |
2019/03/03(日) 09:27:17.06ID:qK6tlWl9a
ROM専からすると多少横道にそれてもいろんな手法を見れるほうが面白い
正直これくらいの質問なら好きにしろって感じだろ
0942デフォルトの名無しさん (アウアウエー Sadf-oIIs)
垢版 |
2019/03/03(日) 12:55:52.71ID:3ZaOSZpTa
述語の部分が、

(1) 全要素を常に == で評価
(2) 全要素を同じ演算子で評価するが、==以外の演算子も使われる場合がある
(3) 要素ごとに個別の評価方法

で最適な答えが変わりそうなんでその辺ははっきりした方がよかったかもね。
質問者は
(a==1) || (a==4) || (a==5) || (a==7)
の代替案を聞いてるんだから普通に考えれば要素数はそんなに多くないはずで
パフォーマンス云々は風呂敷広げすぎだろうw
0943デフォルトの名無しさん (ワッチョイ d763-vAvN)
垢版 |
2019/03/03(日) 13:55:56.58ID:Nfj27eon0
議論の途中で申し訳ないのですが
例えば独自クラスで、こんなのがある。

独自クラス{
string name {get; set;}
decimal num1 {get; set;}
decimal num2 {get; set;}


というのがあって、グリッドビューにList〈独自クラス〉をデータソースとして渡して表示させたいのですが
numは3,4,と増える可能性があります。(型はすべて同じ)
この場合にソースコードをメンテナンスすることなくnumの増減に対応するにはどのようにすれば良いでしょうか?
0947デフォルトの名無しさん (ワッチョイ ff1b-vAqM)
垢版 |
2019/03/03(日) 16:50:33.82ID:fEIk0m7q0
>>943
列が可変になるのならデータテーブル使うのが楽だと思う。クラスでやるとしたらexpandoで作るもなくはないと思うけど、それなら上にある通りDictionaryの方がシンプルではないかと。
0948デフォルトの名無しさん (ワッチョイ 9f2f-2ce8)
垢版 |
2019/03/03(日) 21:37:48.24ID:5kU0Dorz0
>>942
質問者がオーバーヘッド気になるとか発言してるので、パフォーマンスを考慮することに意味はあるんじゃね

まあ、ずらずらと手書き出来る程度の要素数ならどれ使っても大差ないって言っとくべきではあるかもしれんが
レス数が950を超えています。1000を超えると書き込みができなくなります。

ニューススポーツなんでも実況