PDA

View Full Version : چند خروجی در یک Function



edisoon
شنبه 20 مهر 1387, 19:34 عصر
من نیاز به نوشتن یک Function دارم که دارای چند خروجی مختلف باشد.
مثلا هم میخواهم یک مقدار True یا False توسط فانکشن برگردانده شود و هم یک مقدار عددی.
روش این کار چیست؟

در فانکشن زیر فقط یک مقدار Boolean برگردانده میشود.


Function MyFun(ByVal ID As String) As Boolean
Return True
End Function

mostafaaa
شنبه 20 مهر 1387, 19:57 عصر
به صورت همزمان یا optional

baran_mehr
شنبه 20 مهر 1387, 20:04 عصر
من فکر نمیکنم این امکان باشه چون Return فقط یک خروجی رو بر میگردونه.اما خیلی مطمئن رو این قضیه نیستم.
اما میتونید مثلا از یک جدا کننده استفاده کنید مثلا مقدار برگشتی خودتون رو به صورت یک رشته بفرستید و بعد اونو جدا کنید " False , True , 10 "
البته این راه به نظرم رسید شاید اصولی نباشه

mostafaaa
شنبه 20 مهر 1387, 20:23 عصر
من هم فکر نمیکنم به صورت همزمان امکان پذیر باشه.ولی میتونی یه Enum تعریف کنی و مقدار بازگشتی متدت رو optional کنی.

Public Class Form1
Enum OutPutType
[integer]
[Boolean]
End Enum
Function MyMethod(ByVal id As String, ByVal OPType As OutPutType) As Object
If OPType = OutPutType.Boolean Then
Return True
ElseIf OPType = OutPutType.integer Then
Return 1
End If
Return Nothing
End Function
End Class

Chabok
شنبه 20 مهر 1387, 20:34 عصر
میتونید هم پارامتر خود را به صورت مقدار دهی با ارجاع به تابع بدین تا تابع بتونه مقدارش رو تغییر بده .


Function MyFun(ByRef ID As String) As Boolean
ID = 100
Return True
End Functionو هنگام صدا زدن :


Dim ID as Integer
If MyFun(ID) = Trueدر این هنگام مقدار ID شما به 100 تغییر کرده . در واقع با داشتن یک خروجی اصلی میتوانید متغیرهای ارسالی رو هم درون تابع مقدار دهی کنید .

edisoon
شنبه 20 مهر 1387, 21:26 عصر
Optional به دردم نمیخورد، بصورت همزمان میخواهم توسط یک فانکشن چند ورودی را بگیرد و چند خروجی مختلف را برگرداند، امکان دارد خروجیها بیشتر از تعداد ورودیها باشد. یعنی 3 Value به فانکشن ارسال کنم و 5 Value مختلف برگرداند
مثلا یک Boolean یک Integer یک Double و دیگری یک String برگرداند

فکر میکنم Baran_Mehr راه بدی را پیشنهاد ندادن ولی معقول نیست، دنبال راه معقولتری به غیر از استفاده از Class میگردم.

reza6384
شنبه 20 مهر 1387, 22:21 عصر
اگر تعداد خروجی های شما متغیره ولی تعداد DataType هاتون ثابته، یعنی ممکنه تابع شما 7 مقدار برگردونه ، ولی این مقادیر مثلا فقط از سه نوع هستن می تونید از آرایه استفاده کنید و آدرس اون آرایه رو برگردونید.

Dariuosh
شنبه 20 مهر 1387, 22:55 عصر
Optional به دردم نمیخورد، بصورت همزمان میخواهم توسط یک فانکشن چند ورودی را بگیرد و چند خروجی مختلف را برگرداند، امکان دارد خروجیها بیشتر از تعداد ورودیها باشد. یعنی 3 Value به فانکشن ارسال کنم و 5 Value مختلف برگرداند
مثلا یک Boolean یک Integer یک Double و دیگری یک String برگرداند

فکر میکنم Baran_Mehr راه بدی را پیشنهاد ندادن ولی معقول نیست، دنبال راه معقولتری به غیر از استفاده از Class میگردم.

خوب چرا Function ميتوني از SP استفاده کني، هر چندتا ميخواي ورودي داشته باشه هر چند تا هم که بخواي ميتوني OutPut تعريف کني

edisoon
شنبه 20 مهر 1387, 23:37 عصر
خوب چرا Function ميتوني از SP استفاده کني، هر چندتا ميخواي ورودي داشته باشه هر چند تا هم که بخواي ميتوني OutPut تعريف کني

جل الخالق، میشه یه مثال کوچیک بزنی چطوری با SP میشه این کار رو کرد؟

rooshan2008
یک شنبه 21 مهر 1387, 00:32 صبح
سلام
یه نظر هم ما بدیم
این روش می شه




Private Structure Sut
Dim a As String

Dim b As String

End Structure


Private Function ali() As Sut
Dim s As Sut
s.a = 10
s.b = 12
Return s
End Function


نحوه فراخونی :

dim Obj=ali
msgbox (obj.a)
msgbox (obj.b)




یه روش دیگر هم میشه این کار رو کرد




Private Function Roshanfekr(ByRef para1 As Int16, ByRef para2 As Int16) As Integer

para1 = 1
para2 = 2
End Function


نحوه فراخونی


Dim p, p1 As Integer

p = 5
p1 = 8
ali(p, p1)
MsgBox(CStr(p) & " " & p1)




من هم این رو بلد بودم

edisoon
یک شنبه 21 مهر 1387, 01:56 صبح
متاسفانه DataType های من متغیره و از Array نمیتونم استفاده کنم
مثل اینکه توسط Function امکان این کار وجود نداره، یا لااقل هنوز روش اون رو پیدا نکردیم
ولی با راههایی که شما گفتید یه کارهایی میشه انجام داد و مشکل رو موقتا حل کرد.
ولی اگه راه اصولی تری پیدا کردید حتما خبر بدید

MohsenPS
یک شنبه 21 مهر 1387, 04:04 صبح
میتونی نوع خروجی رو Collection تعریف کنی ، یعنی هر چی قراره برگردانده بشه ، توی یک collection قرار بدی و برگردونی، اینطوری نه محدودیت تعداد داده داری نه محدودیت نوع داده.

edisoon
یک شنبه 21 مهر 1387, 09:30 صبح
MohsenPS روش خداپسندانه ای ارائه کردید. نمیدونم چرا به فکر خودم نرسیده بود،از همین روش استفاده میکنم، به شما هم پیشنهاد میکنم از همین روش استفاده کنید چون معقول تره، یه وقت یکی دیگه پیدا نشه یه راه معقولتر ارائه بده ;)

علیرضا مداح
یک شنبه 21 مهر 1387, 17:51 عصر
سلام دوست عزیز،
2 روش به شما به پیشنهاد میکنم :
1)از توابع Generics استفاده نمایید ،
2)مقدار بازگشتی تابع را Object قرار دهید و در هنگام به کارگیری تابع ، مقدار بازگشتی آن را چک کرده و سپس به Type مورد نظر Cast کنید ،/

Microsoft.net
یک شنبه 21 مهر 1387, 18:03 عصر
یه راه دیگه هم اینه که نوع پارامتر ورودی و خروجی رو از نوع ArrayList بگیری که ساده تر از Collection است

edisoon
دوشنبه 22 مهر 1387, 00:27 صبح
سلام دوست عزیز،
2 روش به شما به پیشنهاد میکنم :
1)از توابع Generics استفاده نمایید ،
2)مقدار بازگشتی تابع را Object قرار دهید و در هنگام به کارگیری تابع ، مقدار بازگشتی آن را چک کرده و سپس به Type مورد نظر Cast کنید ،/

اگه امکان داره در مورد روش اول توابع Generics یه کمی بیشتر توضیح بدید و مثال کوچکی بزنید ممنونم