国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Jadual Kandungan
Paypal Checkout JS 支付模式
RESTful API 支付模式
Rumah pembangunan bahagian belakang Tutorial C#.Net Paypal 支付功能的 C# .NET / JS 實現(xiàn)

Paypal 支付功能的 C# .NET / JS 實現(xiàn)

Aug 10, 2018 pm 05:11 PM

說明

最近用到了 Paypal 支付功能,英語一般般的我也不得不硬著頭皮踩一踩這樣的坑。經(jīng)過近乎半個月的作,終于實現(xiàn)了簡單的支付功能,那么首先就說說使用 Paypal 必定要知道的幾點(當(dāng)前日期 2018年08月07日):

1. 你應(yīng)該知道 Paypal 支付功能是支持銀聯(lián)卡的,但是不支持中國買家賬號支付給中國賣家賬號

2. Paypal 接口有兩套,切記,產(chǎn)品環(huán)境和 sandbox 測試環(huán)境不同

3. 測試賬號同樣不能使用中國賬號給中國賬號付款

4. 如果你僅僅想具有固定金額的支付按鈕,用你的 Paypal 商家賬號登錄官網(wǎng),配置頁里面完全可以配置出固定的支付按鈕,然后 Copy 對應(yīng)的 Html 到你的頁面就 OK 了,也就沒有必要通過更復(fù)雜的方式去支付了

image

5. 如果你必須動態(tài)價格和商品信息、或者你要學(xué)習(xí)基本的 Paypal 接口的話,那么就請靜靜的往下看吧

6. 真實環(huán)境支付 Paypal 每一筆都需要收取商家賬號手續(xù)費的,并且手續(xù)費不低,如果你用真實環(huán)境測試,那么一定要記得每一筆都申請退款吧,退款很方便,商家后臺就能直接發(fā)起,退款幾乎是實時的。

Paypal 費用說明:https://www.paypal.com/businesswallet/fees/paypal-fees

image

image

?相關(guān)資料

Paypal 官方地址:https://www.paypal.com/

Paypal 官方測試地址:https://www.sandbox.paypal.com

Paypal 開發(fā)者中心:https://developer.paypal.com/

Paypal API:?https://api.paypal.com

Paypal sandbox API:?https://api.sandbox.paypal.com

Paypal Checkout JS 支付模式

模式圖片:

?image

模式說明:

Checkout JS 模式是一種前端實現(xiàn),使用官方提供的 Checkout.js SDK 實現(xiàn)支付,不需要自己寫直接調(diào)用接口的代碼,相對而言也挺簡單,但是如果你想檢測支付是否成功,你應(yīng)當(dāng)通過調(diào)用接口的方式驗證了。

支付部分代碼:

<p id="paypal-button"></p>
<script src="https://www.paypalobjects.com/api/checkout.js"></script>
<script type="text/javascript">
    paypal.Button.render({
        env: &#39;production&#39;, // production or sandbox 表示產(chǎn)品環(huán)境還是測試環(huán)境
        client: {
            production: &#39;&#39;, // 產(chǎn)品環(huán)境,值為字符串,配置實際商家號的 ClientId
            // sandbox: &#39;&#39;, // 測試環(huán)境,值為字符串,配置商家測試號的 ClientId
        },
        style: {
            size: &#39;medium&#39;,
            color: &#39;black&#39;,
            shape: &#39;pill&#39;,
            label: &#39;paypal&#39;,
            tagline: &#39;false&#39;,
            fundingicons: &#39;true&#39;
        },
        commit: true,
        payment: function (data, actions) {
            return actions.payment.create({
                transactions: [
                    {
                        amount: {
                            total: "0.01",
                            currency: "USD"
                        },
                        description: "測試商品描述",
                        custom: "X00002"
                    }
                ],
                redirect_urls: {
                    return_url: &#39;http://localhost:4478/Success.aspx?type=js&#39;,
                    cancel_url: &#39;http://localhost:4478/Cancel.aspx&#39;
                }
            });
        },
        onAuthorize: function (data, actions) {
            return actions.payment.execute()
                .then(function () {
                    actions.redirect();
                });
        },
        onCancel: function (data, actions) {
            actions.redirect();
        }
    }, &#39;#paypal-button&#39;);
</script>

如果你需要在支付跳轉(zhuǎn)的成功頁再次驗證一下是否支付成功,你需要自己調(diào)用官方提供的 RESTful API,參見下文的 RESTful API 支付模式

RESTful API 支付模式

說明

接口的方式很常見,和支付寶的接口類似,只是使用了 RESTful API 的模式,采用了 Basic Auth 的加密方式。使用接口的模式很常規(guī),我們在頁面點擊按鈕調(diào)用支付接口,彈出支付頁,支付成功跳轉(zhuǎn)到成功頁面,成功頁面再調(diào)用確認支付接口確認結(jié)果。

支付接口調(diào)用:

using System;
using System.Text;
using System.Web.Script.Serialization;
using cn.lovelong.Paypal.Config;
using cn.lovelong.Paypal.Enums;
using cn.lovelong.Paypal.Model;

namespace cn.lovelong.Paypal.Paypal
{
    /// <summary>
    /// CreatePayment 的摘要說明
    /// </summary>
    public class CreatePayment
    {
        public CreatePayment()
        {
        }

        public PaymentResult Pay(string json)
        {
            var jsonResult = HttpHelper.PostJson(
                UrlConfig.CreatePaymentUrl, 
                AccountConfig.ClientId, AccountConfig.Secret, json,
                Encoding.UTF8);
            var result = new JavaScriptSerializer().Deserialize<PaymentResult>(jsonResult);
            return result;
        }

        public PaymentResult Pay(PaymentParam param)
        {
            var json = GetPayParams(param);
            return Pay(json);
        }
        
        public string GetPayParams(PaymentParam param)
        {
            var total = param.Total.ToString("N");
            var currency = Enum.GetName(typeof (PaypalCurrency), param.Currency);
            var payParams = new
            {
                intent = "sale",
                redirect_urls = new
                {
                    return_url = param.ReturnUrl,
                    cancel_url = param.CancelUrl,
                },
                payer = new
                {
                    payment_method = "paypal"
                },
                transactions = new dynamic[]
                {
                    new
                    {
                        amount = new
                        {
                            total = total,
                            currency = currency
                        },
                        description = param.Description,
                        custom = param.Code,
                        item_list = new
                        {
                            items = new dynamic[]
                            {
                                new
                                {
                                    name = param.Name,
                                    //description = param.Name,
                                    quantity = "1",
                                    price = total,
                                    //tax = "0.01",
                                    //sku = "1",
                                    currency = currency
                                }
                            }
                        }
                    }
                }
            };
            var json = new JavaScriptSerializer().Serialize(payParams);
            return json;
        }

        public string GetFullPayParams(decimal total, PaypalCurrency currency, string returnUrl, string cancelUrl)
        {
            var payParams = new
            {
                intent = "sale",
                redirect_urls = new
                {
                    return_url = returnUrl,
                    cancel_url = cancelUrl,
                },
                payer = new
                {
                    payment_method = "paypal"
                },
                transactions = new dynamic[]
                {
                    new
                    {
                        amount = new
                        {
                            total = total.ToString("N"),
                            currency = Enum.GetName(typeof(PaypalCurrency),currency),
                            details = new
                            {
                                subtotal = "30.00",
                                tax = "0.07",
                                shipping = "0.03",
                                handling_fee = "1.00",
                                shipping_discount = "-1.00",
                                insurance = "0.01"
                            }
                        },
                        description = "",
                        custom = "EBAY_EMS_90048630024435",
                        invoice_number = "48787589673",
                        payment_options = new
                        {
                            allowed_payment_method = "INSTANT_FUNDING_SOURCE"
                        },
                        soft_descriptor = "ECHI5786786",
                        item_list = new
                        {
                            items = new dynamic[]
                            {
                                new
                                {
                                    name = "hat",
                                    description = "Brown hat.",
                                    quantity = "5",
                                    price = "3",
                                    tax = "0.01",
                                    sku = "1",
                                    currency = "USD"
                                }
                            },
                            shipping_address = new
                            {
                                recipient_name = "Brian Robinson",
                                line1 = "4th Floor",
                                line2 = "Unit #34",
                                city = "San Jose",
                                country_code = "US",
                                postal_code = "95131",
                                phone = "011862212345678",
                                state = "CA"
                            },
                        }
                    }
                }
            };
            var json = new JavaScriptSerializer().Serialize(payParams);
            return json;
        }
    }
}

確認支付接口:

using System.Text;
using System.Web.Script.Serialization;
using cn.lovelong.Paypal.Config;
using cn.lovelong.Paypal.Model;

namespace cn.lovelong.Paypal.Paypal
{
    /// <summary>
    /// Approved 的摘要說明
    /// </summary>
    public class Approved
    {
        public PaymentResult DoJson(string paymentId, dynamic json)
        {
            var jsonResult = HttpHelper.PostJson(string.Format(UrlConfig.ApprovedUrl, paymentId), 
                AccountConfig.ClientId, AccountConfig.Secret, json, Encoding.UTF8);
            var result = new JavaScriptSerializer().Deserialize<PaymentResult>(jsonResult);
            return result;
        }

        public PaymentResult Do(string paymentId, string payerId)
        {
            var json = GetPayParams(payerId);
            return DoJson(paymentId, json);
        }

        public string GetPayParams(string payerId)
        {
            var payParams = new
            {
                payer_id = payerId
            };
            var json = new JavaScriptSerializer().Serialize(payParams);
            return json;
        }
    }
}

查詢支付結(jié)果接口調(diào)用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
using cn.lovelong.Paypal.Config;
using cn.lovelong.Paypal.Model;

namespace cn.lovelong.Paypal.Paypal
{
    public class ShowPaymentDetails
    {
        public PaymentResult Do(string paymentId)
        {
            var json = HttpHelper.Get(
                string.Format(UrlConfig.ShowPaymentDetailsUrl, paymentId), 
                AccountConfig.ClientId, AccountConfig.Secret,
                Encoding.UTF8);
            var result = new JavaScriptSerializer().Deserialize<PaymentResult>(json);
            return result;
        }
    }
}

最容易出問題的反而是通用類 HttpHelper:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;

namespace cn.lovelong.Paypal
{
    public class HttpHelper
    {
        public static string PostForm(string url, string userName, string password, Dictionary<string,object> dic, Encoding encoding)
        {
            var param = string.Empty;
            foreach (var o in dic)
            {
                if (string.IsNullOrEmpty(param))
                    param += o.Key + "=" + o.Value;
                else
                    param += "&" + o.Key + "=" + o.Value;
            }
            byte[] byteArray = encoding.GetBytes(param);

            //處理HttpWebRequest訪問https有安全證書的問題( 請求被中止: 未能創(chuàng)建 SSL/TLS 安全通道。)
            ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
            
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(encoding.GetBytes(userName + ":" + password)));
            request.PreAuthenticate = true;

            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = byteArray.Length;

            //寫入?yún)?shù)
            Stream newStream = request.GetRequestStream();
            newStream.Write(byteArray, 0, byteArray.Length);
            newStream.Close();

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                using (var stream = response.GetResponseStream())
                {
                    if(stream != null)
                    using (StreamReader sr = new StreamReader(stream, Encoding.UTF8))
                    {
                        return sr.ReadToEnd();
                    }
                }
            }
            return string.Empty;
        }

        public static string PostJson(string url, string userName, string password, string json, Encoding encoding)
        {
            byte[] byteArray = encoding.GetBytes(json);

            //處理HttpWebRequest訪問https有安全證書的問題( 請求被中止: 未能創(chuàng)建 SSL/TLS 安全通道。)
            ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 |
                                                    SecurityProtocolType.Tls;

            HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
            request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(encoding.GetBytes(userName + ":" + password)));
            request.PreAuthenticate = true;

            request.Method = "POST";
            request.Headers.Add("Cache-Control", "no-cache");
            request.ContentType = "application/json";
            request.ContentLength = byteArray.Length;

            //寫入?yún)?shù)
            Stream newStream = request.GetRequestStream();
            newStream.Write(byteArray, 0, byteArray.Length);
            newStream.Close();

            using (HttpWebResponse response = (HttpWebResponse) request.GetResponse())
            {
                using (var stream = response.GetResponseStream())
                {
                    if (stream != null)
                        using (StreamReader sr = new StreamReader(stream, Encoding.UTF8))
                        {
                            return sr.ReadToEnd();
                        }
                }
            }
            return string.Empty;
        }
        
        public static string Get(string url, string userName, string password, Encoding encoding)
        {
            //處理HttpWebRequest訪問https有安全證書的問題( 請求被中止: 未能創(chuàng)建 SSL/TLS 安全通道。)
            ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 |
                                                    SecurityProtocolType.Tls;

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(encoding.GetBytes(userName + ":" + password)));
            request.PreAuthenticate = true;

            request.Method = "GET";
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                using (var stream = response.GetResponseStream())
                {
                    if (stream != null)
                        using (StreamReader sr = new StreamReader(stream, Encoding.UTF8))
                        {
                            return sr.ReadToEnd();
                        }
                }
            }
            return string.Empty;
        }
    }
}
主要的功能都已經(jīng)實現(xiàn)了!看看演示 Demo 吧!
1. 支付頁面
2. Checkout JS 方式(如果你的頁面點擊登錄之后一直在第二個頁面轉(zhuǎn)圈的話,那只能說明你的登錄賬號不能支付你的商家賬號,或者你的賬號如果登錄之后顯示添加銀行卡的提示,說明你的商家賬號和你的賬號都是中國賬號,那你只能添加多幣種卡支付,不能用銀聯(lián)支付了):
付款就好了!
3. 接口方式我就沒有使用彈出頁面了,最簡單的方式(接口會直接在調(diào)用接口的頁面觸發(fā)支付跳轉(zhuǎn)),點擊接口支付
我就不支付了,我用的商家賬號是自己的新加坡的賬號, 按照今天的匯率 $0.01 = ¥0.068,你至少需要支付 0.07 元才能完成支付,而文章開頭也說了,商家需要付稅,也就是說你支付的 0.07 都會變成給 Paypal 的稅,商家一分錢也拿不到,也就是說,你至少支付 3.5元人民幣($0.51 = ¥3.481)商家才能得到微額的款項。
下面給出 Demo 源碼,源碼中配置的商家號是我自己的,請自行修改,為了方便大家沒有商家賬號的朋友做測試我就不刪除了,朋友們也不要真的支付測試,你的測試只會讓 Paypal 賺錢而已!
我的開發(fā)環(huán)境是 VS2015 + C# 6.0 + JS ,代碼僅供參考,請自行修改擴展學(xué)習(xí)使用!

相關(guān)推薦:

調(diào)用支付寶PHP接口API實現(xiàn)在線即時支付功能

.Net實現(xiàn)微信JS-SDK分享功能代碼展示-C#.Net教程

Atas ialah kandungan terperinci Paypal 支付功能的 C# .NET / JS 實現(xiàn). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1502
276
Membuat dan menggunakan atribut tersuai dalam C# Membuat dan menggunakan atribut tersuai dalam C# Jul 07, 2025 am 12:03 AM

CustomAttributes adalah mekanisme yang digunakan dalam C# untuk melampirkan metadata ke elemen kod. Fungsi terasnya adalah untuk mewarisi kelas.attribute kelas dan membaca refleksi pada masa runtime untuk melaksanakan fungsi seperti pembalakan, kawalan kebenaran, dan lain -lain. Khususnya, ia termasuk: 1. 2. Apabila membuat, anda perlu menentukan kelas yang diwarisi dari atribut, dan menggunakan atributeUsage untuk menentukan sasaran aplikasi; 3. Selepas permohonan, anda boleh mendapatkan maklumat ciri melalui refleksi, seperti menggunakan attribute.getCustomatTribute ();

Merancang objek yang tidak berubah dan struktur data di C# Merancang objek yang tidak berubah dan struktur data di C# Jul 15, 2025 am 12:34 AM

Inti merancang objek yang tidak berubah dan struktur data dalam C# adalah untuk memastikan bahawa keadaan objek tidak diubahsuai selepas penciptaan, dengan itu meningkatkan keselamatan benang dan mengurangkan pepijat yang disebabkan oleh perubahan keadaan. 1. Gunakan medan readonly dan bekerjasama dengan inisialisasi pembina untuk memastikan bahawa bidang hanya diberikan semasa pembinaan, seperti yang ditunjukkan dalam kelas orang; 2. Menggabungkan jenis pengumpulan, gunakan antara muka pengumpulan yang tidak berubah seperti readonlycollection atau immutablelist untuk mengelakkan pengubahsuaian luaran koleksi dalaman; 3. Gunakan rekod untuk memudahkan definisi model yang tidak berubah, dan menjana atribut baca dan pembina secara lalai, sesuai untuk pemodelan data; 4. Adalah disyorkan untuk menggunakan System.Collections.imm semasa membuat operasi pengumpulan yang tidak berubah.

Membuat middleware tersuai di ASP.NET Core C# Membuat middleware tersuai di ASP.NET Core C# Jul 11, 2025 am 01:55 AM

Buat middleware tersuai di ASP.Netcore, yang boleh dilaksanakan dengan menulis kelas dan mendaftar. 1. Buat kelas yang mengandungi kaedah InvokeAsync, mengendalikan httpcontext dan requestDelegatenext; 2. Daftar dengan USEMIddleWare dalam Program.CS. Middleware sesuai untuk operasi umum seperti pembalakan, pemantauan prestasi, pengendalian pengecualian, dan lain -lain. Tidak seperti penapis MVC, ia bertindak pada keseluruhan aplikasi dan tidak bergantung pada pengawal. Penggunaan rasional middleware boleh meningkatkan fleksibiliti struktur, tetapi harus mengelakkan mempengaruhi prestasi.

Menulis kod C# yang boleh dipelihara dan boleh diuji Menulis kod C# yang boleh dipelihara dan boleh diuji Jul 12, 2025 am 02:08 AM

Kunci untuk menulis kod C# dengan baik ialah mengekalkan dan menguji. Munasabah membahagikan tanggungjawab, ikuti Prinsip Tanggungjawab Tunggal (SRP), dan ambil akses data, logik perniagaan dan pemprosesan permintaan oleh repositori, perkhidmatan dan pengawal masing -masing untuk meningkatkan kejelasan struktur dan kecekapan ujian. Suntikan antara muka dan kebergantungan pelbagai guna (DI) memudahkan pelaksanaan penggantian, lanjutan fungsi dan ujian simulasi. Ujian unit harus mengasingkan kebergantungan luaran dan menggunakan alat mengejek untuk mengesahkan logik untuk memastikan pelaksanaan yang cepat dan stabil. Menyeragamkan penamaan dan pemisahan fungsi kecil untuk meningkatkan kecekapan pembacaan dan penyelenggaraan. Mematuhi prinsip-prinsip struktur yang jelas, tanggungjawab yang jelas dan mesra ujian dapat meningkatkan kecekapan pembangunan dan kualiti kod.

Amalan terbaik untuk menggunakan LINQ di C# dengan berkesan Amalan terbaik untuk menggunakan LINQ di C# dengan berkesan Jul 09, 2025 am 01:04 AM

Titik berikut harus diikuti apabila menggunakan LINQ: 1. Keutamaan diberikan kepada LINQ apabila menggunakan operasi data deklaratif seperti penapisan, menukar atau mengagregatkan data untuk mengelakkan penggunaan paksa dalam senario dengan kesan sampingan atau senario kritikal prestasi; 2. Memahami ciri -ciri pelaksanaan yang ditangguhkan, pengubahsuaian set sumber boleh membawa kepada hasil yang tidak dijangka, dan kelewatan atau pelaksanaan harus dipilih mengikut keperluan; 3. Beri perhatian kepada prestasi dan overhead memori, panggilan rantai boleh menjana objek pertengahan, dan kod sensitif prestasi boleh digantikan dengan gelung atau rentang; 4. Pastikan pertanyaan ringkas dan mudah dibaca, dan memecah logik kompleks ke dalam pelbagai langkah untuk mengelakkan bersarang dan pencampuran pelbagai operasi yang berlebihan.

Menyelam dalam ke dalam kekangan dan kovarians generik C# Menyelam dalam ke dalam kekangan dan kovarians generik C# Jul 12, 2025 am 02:00 AM

Kekangan generik digunakan untuk menyekat parameter jenis untuk memastikan tingkah laku atau hubungan warisan tertentu, sementara kovariasi membolehkan penukaran subtipe. Sebagai contoh, wheret: icomable memastikan bahawa t adalah setanding; Kovariasi seperti iEnumerable membolehkan iEnumerable untuk ditukar kepada iEnumerable, tetapi ia hanya dibaca dan tidak boleh diubah suai. Kekangan biasa termasuk kelas, struct, baru (), kelas asas dan antara muka, dan kekangan berganda dipisahkan oleh koma; Kovariasi memerlukan kata kunci keluar dan hanya boleh digunakan untuk antara muka dan perwakilan, yang berbeza dari inverter (dalam kata kunci). Perhatikan bahawa kovarians tidak menyokong kelas, tidak boleh ditukar mengikut kehendak, dan kekangan mempengaruhi fleksibiliti.

Memahami C# async dan menunggu perangkap Memahami C# async dan menunggu perangkap Jul 15, 2025 am 01:37 AM

Masalah biasa dengan async dan menunggu di C# termasuk: 1. 2. Mengabaikan konfigurasi (palsu) menyebabkan kebergantungan konteks; 3. Penyalahgunaan Asyncvoid menyebabkan kawalan hilang; 4. Siri menanti mempengaruhi prestasi konkurensi. Cara yang betul adalah: 1. Kaedah Asynchronous hendaklah tidak segerak sepanjang jalan untuk mengelakkan menyekat penyegerakan; 2. Penggunaan konfigurasi (palsu) di perpustakaan kelas digunakan untuk menyimpang dari konteks; 3. Hanya gunakan asyncvoid dalam pemprosesan acara; 4. Tugas -tugas serentak perlu dimulakan terlebih dahulu dan kemudian menunggu untuk meningkatkan kecekapan. Memahami mekanisme dan menyeragamkan penggunaan kod asynchronous yang mengelakkan menulis penyumbatan yang besar.

Melaksanakan antara muka fasih dengan kaedah sambungan C# Melaksanakan antara muka fasih dengan kaedah sambungan C# Jul 10, 2025 pm 01:08 PM

Antara muka fasih adalah kaedah reka bentuk yang meningkatkan kebolehbacaan kod dan ekspresi melalui panggilan rantai. Inti itu ialah setiap kaedah mengembalikan objek semasa, supaya pelbagai operasi boleh dipanggil secara berterusan, seperti Varresult = NewstringBuilder (). Apabila melaksanakan, anda perlu menggabungkan kaedah lanjutan dan corak reka bentuk yang mengembalikan ini, seperti menentukan kelas Fluentstring dan mengembalikannya dalam kaedahnya, dan mewujudkan contoh awal melalui kaedah lanjutan. Senario aplikasi biasa termasuk konfigurasi bangunan (seperti peraturan pengesahan), memeriksa

See all articles